通过保留现有规则向单例KieContainer添加新规则

如何解决通过保留现有规则向单例KieContainer添加新规则

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

配置类:

@Configuration
public class DynamicDroolsConfig {

    private KieServices kieServices;

    @Autowired
    private IPersistentSessionService iPersistentSessionService;

    @postconstruct
    private void init() {
        this.initDataSource();
        this.kieServices = KieServices.Factory.get();
    }

    @Bean
    public KieSession getPersistentKieSession() {
        List<SessioninfoEntity> sessioninfoEntities = iPersistentSessionService.getStoredSessionDetails();

        if (sessioninfoEntities.size() == 0) {
            return newSession();
        } else if (sessioninfoEntities.size() == 1) {
            return persistedSession(sessioninfoEntities.get(0));
        } else {
            // todo other things
            return null;
        }
    }

    @Bean
    public KieServices getKieServices() {
        return this.kieServices;
    }

    @Bean
    public KieContainer getKieContainer() {
        getFileSystem();
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kb = kieServices.newKieBuilder(getFileSystem()).buildAll();
        KieModule kieModule = kb.getKieModule();
        return kieServices.newKieContainer(kieModule.getReleaseId());
    }

    @Bean
    public KieFileSystem getFileSystem() {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        return kieFileSystem;
    }

    public Environment getEnv() {
        Environment env = kieServices.newenvironment();
        env.set(EnvironmentName.ENTITY_MANAGER_FACTORY,Persistence.createEntityManagerFactory("org.drools.persistence.jpa"));
        env.set(EnvironmentName.TRANSACTION_MANAGER,TransactionManagerServices.getTransactionManager());
        return env;
    }

    private void initDataSource() {
        PoolingDataSource ds = new PoolingDataSource();
        ds.setUniqueName("jdbc/BitronixJTADataSource");
        ds.setClassName("com.MysqL.cj.jdbc.MysqLXADataSource");
        ds.setMaxPoolSize(3);
        ds.setAllowLocalTransactions(true);
        ds.getDriverProperties().put("user","root");
        ds.getDriverProperties().put("password","1234");
        ds.getDriverProperties().put("URL","jdbc:MysqL://localhost:3306/drool_demo");
        ds.init();
    }

    private KieSession newSession() {
        return kieServices.getStoreServices().newKieSession(getKieContainer().getKieBase(),null,getEnv());
    }

    private KieSession persistedSession(SessioninfoEntity sessioninfoEntity) {
        return kieServices.getStoreServices().loadKieSession(sessioninfoEntity.getId(),getKieContainer().getKieBase(),getEnv());
    }
}

容器releaseId更新方法

@Service
public class DroolsUtilityImpl implements IDroolsUtility {

    @Autowired
    private KieFileSystem fileSystem;
    @Autowired
    private KieServices services;
    @Autowired
    private KieContainer container;

    @Override
    public void updateContainer(String rules) {

//        System.out.println("drl:\n" + rules);
        fileSystem.write("src/main/resources/rules/rule.drl",rules);
        KieBuilder kb = services.newKieBuilder(fileSystem).buildAll();
        KieModule kieModule = kb.getKieModule();
        container.updatetoVersion(kieModule.getReleaseId());
    }

    @Override
    public void viewContainerRules() {

        KieBase kieBase = container.getKieBase();
        for (KiePackage kp : kieBase.getKiePackages()) {
            for (Rule rule : 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();

取自 https://www.codota.com/web/assistant/code/rs/5c65b1cf1095a5000171b19f#L199

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?