Java 通过保留现有规则向singleton容器添加新规则
在Spring启动项目中,我试图向具有会话持久性的单例容器添加新规则。我已经实现了向KieContainer添加新规则的编程方法,但是每次我更新KieContainer的ReleaseID时,现有规则都会被替换。我想要的是保留Drools会话中存在的现有规则,并向其中添加新规则。我的实用程序类中的updateContainer()函数是我对容器进行更改的方式。欢迎任何建议。我的执行情况如下: 配置类:Java 通过保留现有规则向singleton容器添加新规则,java,spring,spring-boot,drools,drools-guvnor,Java,Spring,Spring Boot,Drools,Drools Guvnor,在Spring启动项目中,我试图向具有会话持久性的单例容器添加新规则。我已经实现了向KieContainer添加新规则的编程方法,但是每次我更新KieContainer的ReleaseID时,现有规则都会被替换。我想要的是保留Drools会话中存在的现有规则,并向其中添加新规则。我的实用程序类中的updateContainer()函数是我对容器进行更改的方式。欢迎任何建议。我的执行情况如下: 配置类: @配置 公共类动态工具配置{ 私人服务; @自动连线 私人IPersistentSession
@配置
公共类动态工具配置{
私人服务;
@自动连线
私人IPersistentSessionService IPersistentSessionService;
@施工后
私有void init(){
this.initDataSource();
this.kieServices=kieServices.Factory.get();
}
@豆子
公共会话getPersistentKieSession(){
List SessionInfo Entities=iPersistentSessionService.getStoredSessionDetails();
if(sessionInfo实体.size()==0){
返回newSession();
}else if(sessionInfo实体.size()==1){
返回persistedSession(sessionInfo.get(0));
}否则{
//做其他事情
返回null;
}
}
@豆子
公共服务{
归还此服务;
}
@豆子
公共KieContainer getKieContainer(){
getFileSystem();
KieRepository KieRepository=kieServices.getRepository();
addKieModule(kieRepository::getDefaultReleaseId);
KieBuilder kb=kieServices.newKieBuilder(getFileSystem()).buildAll();
KieModule KieModule=kb.getKieModule();
返回kieServices.newKieContainer(kieModule.getReleaseId());
}
@豆子
公共文件系统getFileSystem(){
KieFileSystem KieFileSystem=kieServices.newKieFileSystem();
返回文件系统;
}
公共环境getEnv(){
Environment env=kieServices.newEnvironment();
set(EnvironmentName.ENTITY\u MANAGER\u工厂,Persistence.createEntityManagerFactory(“org.drools.Persistence.jpa”);
set(EnvironmentName.TRANSACTION_MANAGER,TransactionManagerServices.getTransactionManager());
返回环境;
}
私有void initDataSource(){
PooligDataSource ds=新的PooligDataSource();
ds.setUniqueName(“jdbc/BitronixJTADataSource”);
setClassName(“com.mysql.cj.jdbc.MysqlXADataSource”);
ds.setMaxPoolSize(3);
ds.setAllowLocalTransactions(真);
ds.getDriverProperties().put(“用户”、“根”);
ds.getDriverProperties().put(“密码”、“1234”);
ds.getDriverProperties().put(“URL”,“jdbc:mysql://localhost:3306/drool_demo");
ds.init();
}
私人会话新闻会话(){
返回kieServices.getStoreServices().newKieSession(getKieContainer().getKieBase(),null,getEnv());
}
私有会话persistedSession(SessionInfo实体SessionInfo实体){
返回kieServices.getStoreServices().loadKieSession(sessionInfo.getId(),getKieContainer().getKieBase(),null,getEnv());
}
}
容器释放ID更新方法:
@服务
公共类DroolsUtilityImpl实现IDroolsUtility{
@自动连线
私有文件系统;
@自动连线
私人服务;;
@自动连线
私人集装箱;
@凌驾
公共无效更新容器(字符串规则){
//System.out.println(“drl:\n”+规则);
write(“src/main/resources/rules/rule.drl”,rules);
KieBuilder kb=services.newKieBuilder(fileSystem.buildAll();
KieModule KieModule=kb.getKieModule();
container.updateToVersion(kieModule.getReleaseId());
}
@凌驾
public void viewContainerRules(){
KieBase KieBase=container.getKieBase();
对于(KiePackage kp:kieBase.getKiePackages()){
for(规则:kp.getRules()){
System.out.println(rule.getName());
}
}
}
}
我会尝试重新生成pom并增加发布Id。有点像下面的示例:
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML( releaseId )
.write( "src/main/resources/KBase1/org/pkg1/r1.drl", createDrl( "R1" ) )
.write( "src/main/resources/KBase1/org/pkg2/r2.drl", createDrl( "R2" ) )
.writeKModuleXML( createKieProjectWithPackages( ks, "org.pkg1" ).toXML() );
ks.newKieBuilder( kfs ).buildAll();
取自
但为什么?我看不到这个功能的实用性,只看到了确保您添加的规则在旧上下文中有效所需的巨大开销(例如没有重复的标识符,诸如此类的事情)@RoddyOfFrozenpeas我将同时维护singleton KieSession和KieContainer,所以我想获取会话的现有规则。这个pom xml引用的是同一个maven pom。xmlIt是kjar中的pom。请参见行
generateAndWritePomXML
?