drools - 何时使用多个 KieBase 与多个 KieSession?
问题描述
我知道可以使用多个 KieBases 和多个 KieSessions,但我不明白在什么情况下使用一种方法与另一种方法(我在一般理解 KieContainer、KieBase、KieModule 和基会议)。有人可以澄清一下吗?
解决方案
当您有多组规则做不同的事情时,您会使用多个 KieBase。
KieSessions 是规则执行的实际会话——也就是说,它们保存您的数据和一些元数据,并且是实际执行规则的内容。
假设我有一个学校的申请。我的应用程序的一部分监控学生的出勤率。我申请的另一部分跟踪他们的成绩。我有一套规则来决定学生是否逃学,我们需要和他们的父母谈谈。我有一套完全不相关的规则,可以确定学生是否在学业上有困难,是否需要接受试用/绩效计划。
这些规则彼此无关。它们具有完全独立的关注点、不同的规则输入,并在应用程序的不同部分触发。跟踪考勤的应用程序部分不需要触发监控学生表现的规则。
对于这个应用程序,我将有两个不同的 KieBase:一个用于出勤,一个用于学术。当我需要触发规则时,我会触发其中一个 - 没有同时触发两个规则的用例。
KieSession 是我们触发这些规则时的运行时。我们向它添加触发规则所需的数据,它还跟踪一些与本次讨论真正无关的其他元数据。在触发学术规则时,我会在其中添加学生的成绩、他们的班级,以及可能关于学生的一些信息(例如年级水平,他们是否是“荣誉”学生,等等)。对于出勤规则,我们需要学生信息,以及历史迟到/缺勤记录。这些不同的数据被添加到会话中。
当我们决定触发规则时,我们首先获得适当的 KieBase——学术或出勤率。然后我们为该规则集获取一个会话,填充数据并触发它。我们在技术上“执行”会话,而不是规则(绝对不是规则库)。规则库只是规则的集合;会话是我们实际执行它的方式。
有两种会话——有状态的和无状态的。正如它们的名字所暗示的那样,它们的不同之处在于数据的存储和跟踪方式。在大多数情况下,人们使用有状态会话是因为他们希望他们的规则对输入进行迭代工作。您可以在文档中阅读有关具体差异的更多信息。
对于低容量应用程序,通常几乎不需要重用您的 KieSessions。根据需要创建、使用和处置它们。然而,在这个过程中有一些固有的开销,所以在某个时候重用确实成为你应该考虑的事情。该文档讨论了为 Drools 提供的开箱即用的解决方案,即会话池。
(当你试图理解这一点时,我喜欢使用数据库的类比。会话就像 JDBC 连接:对于小型应用程序,您可以创建、使用它们,然后根据需要关闭它们。但是随着您的扩展您会很快发现您需要研究连接池以最大限度地减少这种开销。在这个特殊的类比中,规则库将是规则正在执行的数据库——而不是表!)
推荐阅读
- docker - 应用程序二进制文件应该在挂载或卷中,还是应该只存在于 docker 容器中?
- regex - Strange behaviour of Regexp_replace in a Hive SQL query
- vba - 来自外部表的信息不会显示在文本框中
- angular - 角度 6 router.redirect 不调用 onInit()
- spring - Spring项目启动失败:未导入Jwt依赖
- reactjs - 将 barchat x 轴值设为范围
- flutter - 使用contacts_service进行新更新后应用程序崩溃
- django - “str”对象没有“已验证”属性
- javascript - 如何更改二叉树索引中递归的保留?
- fastlane - 快车道:找不到动作、车道或变量“”