java - 流口水 6 : add rules to a running KieSession

标签 java drools kie

到目前为止,我无法找出向 Drools 6.0.0 中正在运行的 KieSession 添加规则并仍将我的事实保留在 KieSession 中的最佳方法(即以最小的开销)。在 Drools 5 中,当 KBase 更改时,KSession 也会更新,但对于 Drools 6 似乎并非如此,因为我的规则不是在 KieBase 中创建的。有没有一种方法可以在不替换 KieFileSystem 中的整个 KieModules 或 Jars 的情况下完成此操作。我认为应该有一个简单的方法。

你们有什么想法吗?

问候

最佳答案

是的,支持该用例,但重要的是要了解 Drools 6 引入了版本化可部署工件(mavenized kjar)的概念。换句话说,一旦您创建了版本 X 的 kjar,它就应该是不可变的。如果您想向 kjar 中定义的 kbase 添加/删除规则,您应该创建另一个 kjar 版本 X+1。这个 kjar 可以作为真正的 jar 在磁盘中物理创建,也可以在内存中创建。

了解 kjar 是不可变源工件以及 kcontainer 是实例化 kjar 并允许使用其 kbase 和 ksession 的容器这一概念也很重要。

如果理解了这一点,那么您需要做的就是实例化版本 X 的容器,当您想要更改 kbase 时,调用容器 updateToVersion(...) 方法将其更新到新版本。 KBase 和 KSession 会像在 Drools 5 中一样逐步更新和保留。

此处进行单元测试:https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test/java/org/drools/compiler/integrationtests/IncrementalCompilationTest.java#L158

代码片段:

    // work with version 1.0.0
    ReleaseId releaseId1 = ks.newReleaseId("org.kie", "test-upgrade", "1.0.0");
    ...

    // Create a session and fire rules
    KieContainer kc = ks.newKieContainer( releaseId1 );
    KieSession ksession = kc.newKieSession();
    ksession.insert(new Message("Hello World"));
    ...

    // upgrade to version 1.1.0
    ReleaseId releaseId2 = ks.newReleaseId("org.kie", "test-upgrade", "1.1.0");
    kc.updateToVersion(releaseId2);

    // continue working with the session
    ksession.insert(new Message("Hello World"));
    ...

关于java - 流口水 6 : add rules to a running KieSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205945/

相关文章:

java - JNI 中的二维 C 数组

java - 检查字符串列表中的任何字符串是否出现在段落(字符串)中?

java - Maven 本地 Artifact 解析在 1 天后不起作用

java - 从其他位置(数据库、http...)加载 JSF facelets 文件(模板、 View )

java - Spring Boot 2 中 Micrometer 的自定义 Cloudwatch MeterRegistry

java - 线程池的工作方式不可预测

java - Spring Boot JPA .save() 更新所有记录

maven - Drools kie-ci 示例在 ubber jar 中失败,但在 eclipse IDE 上失败

java - 为什么将 Drools 6 KIE JAR 加载到代码中会失败?

java - 为什么缓存的 Drools KIE 基础仍然需要源 .drl 文件?