Drools重用StatefulKnowledgeSession?

时间:2011-10-19 18:45:41

标签: java drools

我遇到了一个问题,即创建新的drools StatefulKnowledgeSession实例是CPU密集型的。有一个旧的涉及它的链接here。我不确定我是如何解决它的,所以我想我会创建一个它们的池。到目前为止,我完全无法确定它们是否可以重复使用。我知道它们不是多线程安全的,因为有2个线程同时运行规则,但是我可以在最后一次使用后调用dispose()之后在新线程中重用一个会话吗?

3 个答案:

答案 0 :(得分:3)

我最终创建了一个KnowledgeSessionConfiguration,并在每次创建KnowledgeSession时重复使用它。无论出于何种原因(显然是一个很大的类路径),创建配置对我来说非常昂贵,就像我链接的文章一样。我不确定通过仅创建一次KnowledgeSessionConfiguration并重复使用它而失去了什么。一切似乎都表现正常。

答案 1 :(得分:1)

如果您在单独的上下文中创建知识库,那么创建statefulKnowledgeSessions并不昂贵。您只需要避免每次需要会话时编译规则(builder.add())。您可以为每个请求创建一个新会话并将其处理以避免内存泄漏,我认为您可以很好地创建会话而不是尝试重用它们。 干杯

答案 2 :(得分:0)

最近我正在使用Drools创建一个规则引擎应用程序。我遇到过类似情况。

我最终使用了基于 Apache GenericObjectPool 界面的 KieSession池。您所需要做的就是提供一种创建和销毁KieSession对象的方法。

使用缓冲池,您可以将借来的KieSession对象返回缓冲池,也可以简单地对其进行无效(这将处置,从而释放内存)。仅将其返回给Pool并不能解决问题,因为在触发规则后KieSession的工作内存是 dirty 。同样,简单地删除事实句柄也无法解决问题,因为KieSession引用了很多对象,例如( agenda,globalResolver,kieBaseEventListeners,ruleRuntimeEventSupport,defaultEntryPoint,timerService,initialFactHandle ),这些对象也很脏。

幸运的是, StatefulKnowledgeSessionImpl 提供了一个重置​​KieSession的功能,该功能又恢复了所有这些对象并使其像新创建的KieSession 。您需要自己比较哪个更适合您,简单地创建一个新的或重置现有的一个。 另一方面是在将KieSession用作Pool之后,如果将Pool配置为 optimum minIdle 值(这将始终确保 minimum KieSessions 对象),则您完全不需要在旅途中创建会话。始终处于池中,因此在执行规则时无需创建会话对象。