Drools 何时使用多个Kiebase vs多个KieSession?

Drools 何时使用多个Kiebase vs多个KieSession?,drools,Drools,我知道一个人可以使用多个KieBase和多个KieSession,但我不知道在什么情况下,一个人会使用一种方法与另一种方法(我在理解KieContainer、KieBase、KieModule和KieSession之间的定义和关系时遇到了一些困难)。有人能澄清一下吗?当你有多套规则做不同的事情时,你会使用多个基址 KieSessions是规则执行的实际会话——也就是说,它们保存您的数据和一些元数据,并且是实际执行规则的对象 假设我有一份学校申请书。我的应用程序的一部分监控学生的出勤情况。我的应

我知道一个人可以使用多个KieBase和多个KieSession,但我不知道在什么情况下,一个人会使用一种方法与另一种方法(我在理解KieContainer、KieBase、KieModule和KieSession之间的定义和关系时遇到了一些困难)。有人能澄清一下吗?

当你有多套规则做不同的事情时,你会使用多个基址

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


假设我有一份学校申请书。我的应用程序的一部分监控学生的出勤情况。我的应用程序的另一部分跟踪他们的成绩。我有一套规则来决定学生是否逃学,我们需要和他们的父母谈谈。我有一套完全不相关的规则来决定一个学生是否在学业上有问题,是否需要进行试用/绩效计划

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

对于这个应用程序,我将有两个不同的基础:一个用于出席,一个用于学术。当我需要启动规则时,我会启动其中一个——没有同时启动这两个规则的用例


KieSession是我们触发这些规则时的运行时。我们向它添加触发规则所需的数据,它还跟踪与本次讨论无关的其他元数据。在取消学术规则时,我会在其中添加学生的成绩、班级以及一些关于学生的信息(例如,年级水平、他们是否是“优等生”,等等)。对于出勤规则,我们需要学生信息,以及历史迟到/缺勤记录。这些不同的数据片段被添加到会话中

当我们决定取消规则时,我们首先得到适当的基础——学术或出席。然后,我们为该规则集获取一个会话,填充数据并启动它。我们在技术上“执行”会话,而不是规则(当然也不是规则库);会话是我们实际执行它的方式

有两种类型的会话——有状态会话和无状态会话。顾名思义,它们在数据存储和跟踪方式上有所不同。在大多数情况下,人们使用有状态会话是因为他们希望自己的规则对输入进行迭代工作。您可以阅读更多有关中的具体差异的信息

对于低容量应用程序,通常不需要重用会话。根据需要创建、使用和处置它们。然而,在这个过程中存在一些固有的开销,因此有一个地方,重用应该成为您应该考虑的事情。该文档讨论了为Drools提供的现成解决方案,即会话池

(当你想了解这一点时,我喜欢使用数据库的类比。会话就像JDBC连接:对于小型应用程序,你可以创建它们,使用它们,然后根据需要关闭它们。但是随着你的扩展,你会很快发现你需要研究连接池来最小化这种开销。在这个特殊的类比中规则库将是执行规则所针对的数据库,而不是表!)