规则引擎11 分钟读完 (大约1658个字) stateful session 有状态会话
有状态会话长期存在,并允许随着时间的推移进行迭代更改。 有状态会话的一些常见用例包括但不限于:
- 监测
半自动买入股票市场监控与分析。
- 诊断
故障查找,医疗诊断
- 物流
包裹跟踪和送货配置
- 合规
验证市场交易的合法性。
与无状态会话相反,必须先调用 dispose() 方法,以确保没有内存泄漏,因为 KieBase 包含创建状态知识会话时的引用。 由于状态知识会话是最常用的会话类型,所以它只是在 KIE API 中命名为 KieSession。 KieSession 还支持 BatchExecutor 接口,如 StatelessKieSession,唯一的区别是 FireAllRules 命令在有状态会话结束时不被自动调用。
我们举例说明了用于提高火灾报警器的监控用例。 只使用四个类,我们假设 Room
代表房子里的房间,每个 Room
都有一个喷头 Sprinkler
。 如果在房间里发生火灾,我们用一个 Fire
实例来表示, 用 Alarm
代表警报 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Room { private String name }
public class Sprinkler { private Room room; private boolean on; }
public class Fire { private Room room; }
public class Alarm { }
|
在上一节无状态会话中介绍了插入和匹配数据的概念。 这个例子假设每个对象类型的都是单个实例被插入的,因此只使用了字面约束。 然而,房子有许多房间,因此 rules
必须表达实体类之间的关系,例如在某个房间内的喷洒器。 这最好通过使用绑定变量作为模式中的约束来完成。 这种“加入”过程产生了所谓的“cross products”,这在下一节中将会介绍。