2

直到现在,我还想不出在 Drools 6.0.0 中向正在运行的 KieSession 添加规则并且仍然将我的事实保存在 KieSession 中的最佳方式(意味着以最小的开销)。在 Drools 5 中,KSession 会在 KBase 更改时更新,但 Drools 6 似乎并非如此,因为我的规则不是在 KieBase 中创建的。有没有办法在不替换 KieFileSystem 中的整个 KieModules 或 Jars 的情况下做到这一点。我认为应该有一个简单的方法。

你们有什么想法吗?

问候

4

1 回答 1

10

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

同样重要的是要理解 kjar 是不可变的源工件,而 kcontainer 是实例化 kjar 并允许使用其 kbase 和 ksession 的容器这一概念。

如果理解了,那么您需要做的就是实例化版本 X 的容器,当您想要更改 kbase 时,调用容器 updateToVersion(...) 方法将其更新到新版本。KBases 和 KSessions 像在 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"));
    ...
于 2014-03-05T20:42:59.740 回答