【问题标题】:Drools:stateless vs stateful knowledge sessionDrools:无状态与有状态知识会话
【发布时间】:2013-06-15 00:44:57
【问题描述】:

无状态知识会话和有状态知识会话有什么区别。我阅读了一些文档都保持状态。但是我什么时候可以使用无状态/有状态知识会话。

【问题讨论】:

    标签: drools


    【解决方案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 : "规则执行后插入的数据对象不会存储在工作内存中"。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-23
                  • 1970-01-01
                  • 2020-01-05
                  • 2017-08-29
                  • 1970-01-01
                  相关资源
                  最近更新 更多