到目前为止,我无法找出向 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 中一样逐步更新和保留。
代码片段:
// 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/