Drools:无国籍与有状态知识会话

时间:2013-06-18 17:18:24

标签: drools

无状态知识会话和有状态知识会话之间有什么区别。我读了一些文档都处于维护状态。但是我什么时候可以使用无状态/有状态知识会话。

6 个答案:

答案 0 :(得分:16)

无状态: 在触发规则之前,事实/工作存储器被插入到知识库会话中。可以通过在执行规则时调用对象上的公共方法来设置这些事实,并在设置这些对象后返回更改的值。

执行规则时事实上的任何更改(例如insert(xyz)modify(xyz))都不会知道规则引擎。

有状态: 在触发规则之前将事实/工作内存插入知识库会话,并且在触发规则之后,必须调用dispose()以避免内存泄漏。

执行规则时事实的任何变化,例如insert(xyz)modify(xyz),都会使规则引擎知道。

答案 1 :(得分:6)

无状态意味着为每个请求创建一个新会话(因此不维护任何状态)。有状态意味着它将从前一个命令结束时的会话状态继续(例如,插入到会话中的所有数据仍然存在)。

答案 2 :(得分:5)

我看到的方式的基本区别在于会话在无状态下自动处理的方式。选择一个与其他相比,没有任何性能提升。实际上,无状态会话使用它后面的有状态会话。那就去吧!

答案 3 :(得分:1)

我想在这里引用drools文档,这让我明白了。

  

" StatelessKnowledgeSession提供了一个方便的API,包装   StatefulKnowledgeSession。它避免了调用dispose()的需要。   无状态会话不支持迭代调用,即行为   调用execute(...)是一种内部单击方法   实例化StatefulKnowledgeSession,添加所有用户数据和   执行用户命令,调用fireAllRules,然后调用dispose()。"

基本上,无状态会话是一次使用的有状态会话。

这意味着无状态会话也可以做推理,不像许多文档和这里的一些答案所说的!这应该只取决于"然后"规则的一部分,无论你使用"修改"或不。

虽然我自己没有验证,但这篇文章似乎支持我的推理。

https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g

答案 4 :(得分:0)

在有状态会话中,即使在之前触发规则之后,我们也可以修改事实并重新插入事件。

另一方面,在无状态会话中,一旦所有规则被触发(使用execute()),我们就无法进一步修改事实并将它们重新插入到会话中(因为会话在{{1}之后无法使用被称为)。

答案 5 :(得分:0)

此链接准确无误:https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g 流口水应该在官方文件中添加。

有状态:“插入的数据对象将成为工作内存的一部分,以后可以重复使用以进一步执行规则。”

无状态:“在执行规则后,插入的数据对象将不会存储在工作存储器中”。

相关问题