何时使用多个 KieBase 与多个 KieSession?

When to use multiple KieBases vs multiple KieSessions?

我知道可以使用多个 KieBase 和多个 KieSession,但我不明白在什么情况下人们会使用一种方法而不是另一种方法(我在一般理解 KieContainer、 KieBase、KieModule 和 KieSession)。有人可以澄清一下吗?

当你有多组规则做不同的事情时,你会使用多个 KieBase。

KieSession 是规则执行的实际会话——也就是说,它们保存您的数据和一些元数据,并且是实际执行规则的会话。


假设我有一份学校申请。我的应用程序的一部分监控学生的出勤情况。我申请的另一部分跟踪他们的成绩。我有一套规则来决定学生是否逃学,我们需要与他们交谈 parents。我有一套完全不相关的规则,用于确定学生是否在学业上有问题,是否需要纳入 probation/a 绩效计划。

这些规则彼此无关。它们具有完全独立的关注点、不同的规则输入,并在应用程序的不同部分触发。应用程序中跟踪出勤率的部分不需要触发监控学生表现的规则。

对于此应用程序,我将有两种不同的 KieBase:一种用于出勤,一种用于学术。当我需要触发规则时,我会触发一个或另一个——没有同时触发两个规则的用例。


KieSession 是我们触发这些规则时的运行时。我们将触发规则所需的数据添加到其中,它还会跟踪一些与本次讨论真正无关的其他元数据。在触发学术规则时,我会在其中添加学生的成绩、他们的类,也许还有一些关于学生的信息(例如年级,他们是否是“荣誉”学生,等等)。对于出勤规则,我们需要学生信息以及历史 tardiness/absence 记录。这些不同的数据被添加到会话中。

当我们决定触发规则时,我们首先获得适当的 KieBase——学术或出勤率。然后我们获得该规则集的会话,填充数据并触发它。我们在技术上“执行”会话,而不是规则(绝对不是规则库)。规则库只是规则的集合;会话是我们实际执行它的方式。

有两种会话——有状态和无状态。顾名思义,它们在数据存储和跟踪方式上有所不同。在大多数情况下,人们使用有状态会话是因为他们希望他们的规则对输入进行迭代工作。您可以在 documentation.

中阅读有关具体差异的更多信息

对于 low-volume 应用程序,通常很少需要重用您的 KieSession。根据需要创建、使用和处置它们。然而,在这个过程中存在一些固有的开销,所以有一点重用确实成为您应该考虑的事情。该文档讨论了为 Drools 提供的 out-of-the 框解决方案,即会话池。

(当你试图解决这个问题时,我喜欢使用数据库的类比。会话就像一个 JDBC 连接:对于小型应用程序,你可以创建它们,使用它们,然后关闭它们根据需要使用它们。但是随着规模的扩大,您很快就会发现需要研究连接池以最大程度地减少这种开销。在这个特定的类比中,规则库将是规则正在执行的数据库,而不是表!)