规则引擎 Drools (四):KIESession 与 StatelessKIESession

KIESession 分为两类:

  • Stateful 有状态的会话
  • Stateless 无状态的会话

KIESession

KIESession 会在多次与规则引擎进行交互中,维护会话的状态。

定义 KieSession,在 kmodule.xml 文件中定义 type 为 stateful 的 session:

<ksession name="stateful_session" type="stateful"></ksession>  

Tip:stateful 是 type 属性的默认值。

获取 KIESession 实例:

KieSession statefulSession = kieContainer.newKieSession("stateful_session");  

接下来,可以在 KIESession 执行一些操作。

最后,如果需要清理 KIESession 维护的状态,调用 dispose() 方法。

StatelessKIESession

与 KIESession 相反,StatelessKIESession 隔离了每次与规则引擎的交互,不会维护会话的状态。

如果将 session 比作编程语言中的函数,StatelessKIESession 就是无副作用的函数。

StatelessKIESession 适用场景:

  • 数据校验
  • 运算
  • 数据过滤
  • 消息路由
  • 任何能被描述成函数或公式的规则

定义 StatelessKIESession,在 kmodule.xml 文件中定义 type 为 stateless 的 session:

<ksession name="stateless_session" type="stateless"></ksession>  

获取 StatelessKIESession 实例:

StatelessKieSession statelessKieSession = kieContainer.newStatelessKieSession("stateless_session");  

通过 KieServices 获取 command 工厂类 KieCommands:

KieCommands commandFactory = kieServices.getCommands();  

可以使用工程类 KieCommands 调用 newXXXCommand 开头的方法创建 command 实例。

会话执行 command:

statelessKieSession.execute(command);