Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过保留现有规则向singleton容器添加新规则_Java_Spring_Spring Boot_Drools_Drools Guvnor - Fatal编程技术网

Java 通过保留现有规则向singleton容器添加新规则

Java 通过保留现有规则向singleton容器添加新规则,java,spring,spring-boot,drools,drools-guvnor,Java,Spring,Spring Boot,Drools,Drools Guvnor,在Spring启动项目中,我试图向具有会话持久性的单例容器添加新规则。我已经实现了向KieContainer添加新规则的编程方法,但是每次我更新KieContainer的ReleaseID时,现有规则都会被替换。我想要的是保留Drools会话中存在的现有规则,并向其中添加新规则。我的实用程序类中的updateContainer()函数是我对容器进行更改的方式。欢迎任何建议。我的执行情况如下: 配置类: @配置 公共类动态工具配置{ 私人服务; @自动连线 私人IPersistentSession

在Spring启动项目中,我试图向具有会话持久性的单例容器添加新规则。我已经实现了向KieContainer添加新规则的编程方法,但是每次我更新KieContainer的ReleaseID时,现有规则都会被替换。我想要的是保留Drools会话中存在的现有规则,并向其中添加新规则。我的实用程序类中的updateContainer()函数是我对容器进行更改的方式。欢迎任何建议。我的执行情况如下:

配置类:

@配置
公共类动态工具配置{
私人服务;
@自动连线
私人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