Drools:无状态与有状态知识会话
Posted
技术标签:
【中文标题】Drools:无状态与有状态知识会话【英文标题】:Drools:stateless vs stateful knowledge session 【发布时间】:2013-06-15 00:44:57 【问题描述】:无状态知识会话和有状态知识会话有什么区别。我阅读了一些文档都保持状态。但是我什么时候可以使用无状态/有状态知识会话。
【问题讨论】:
【参考方案1】:无状态: 事实/工作记忆在触发规则之前被插入到知识库会话中。这些事实可以通过在执行规则时调用对象上的公共方法来设置,并且在设置这些对象后返回更改的值。
在执行规则时发生的任何事实变化,例如insert(xyz)
或modify(xyz)
,都不会被规则引擎察觉。
有状态的: 事实/工作内存在触发规则之前插入到知识库会话中,并且在触发规则之后必须调用 dispose() 以避免内存泄漏。
在执行规则时发生的任何事实变化,例如insert(xyz)
或modify(xyz)
,都会通知规则引擎。
【讨论】:
【参考方案2】:无状态意味着为每个请求创建一个新会话(因此不维护任何状态)。有状态意味着它将从上一个命令结束时会话的任何状态继续(例如,插入到会话中的所有数据仍然存在)。
【讨论】:
【参考方案3】:我看到的基本区别是会话在无状态下自动处理的方式。选择一个与另一个没有性能增益。实际上,无状态会话在其背后使用有状态会话。算了吧!
【讨论】:
【参考方案4】:我想在此处引用令我清醒的口水文档。
"StatelessKnowledgeSession 提供了一个方便的 API,包装 有状态的知识会话。它避免了调用 dispose() 的需要。 无状态会话不支持迭代调用, 调用 execute(...) 是一个单一的方法,将在内部 实例化 StatefulKnowledgeSession,添加所有用户数据并 执行用户命令,调用fireAllRules,然后调用dispose()。"
所以基本上,无状态会话是一次使用的有状态会话。
这意味着无状态会话也可以进行推理,这与许多文档和这里的一些答案不同!这应该只取决于规则的“then”部分,无论您是否使用“modify”。
虽然我自己没有验证这一点,但这篇文章似乎支持了我的推理。
https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g
【讨论】:
【参考方案5】:在有状态会话中,我们可以修改事实并重新插入它们,即使之前触发了规则。
另一方面,在无状态会话中,一旦所有规则都被触发(使用execute()
),我们不能进一步修改事实并将它们重新插入会话中(因为在调用execution()
之后会话不可用)。
【讨论】:
【参考方案6】:1) 在无状态知识会话的情况下,在执行规则时,即一旦调用 fireRules 方法,规则引擎就无法修改插入的事实(在 then 部分)。在有状态知识会话的情况下,事实的任何变化都可用于规则引擎。
2) 一旦规则被触发,Stateful Knowledge Session 对象必须调用方法 dispose() 来释放会话并避免内存泄漏。
3) 在有状态知识会话的情况下,对事实的任何更改都可用于规则引擎。所以规则被迭代地调用。如果在 DRL 的最后一条规则中修改了 Fact A,则此更改将重新激活所有规则并触发基于 Fact A 构建的规则。Stateless Knowledge Session 不是这种情况。
隐藏的事实是无状态会话在其背后使用有状态会话
【讨论】:
【参考方案7】:这个链接是准确的:https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g Drools 应该在官方文档中添加。
有状态:“插入的数据对象将成为工作内存的一部分,以后可以重复使用以进一步执行规则。”
Stateless : "规则执行后插入的数据对象不会存储在工作内存中"。
【讨论】:
以上是关于Drools:无状态与有状态知识会话的主要内容,如果未能解决你的问题,请参考以下文章