Jboss rules规则引擎 Drools 6.4.0 Final 教程(5)
6、Drools6.4版本关于session的不同方法
KIE = Knowledge is Everything
在 JBoss 定义的 knowledge 除了规则引擎 Drools 之外,还有工作流引擎 jBPM
KieServices
KieServices 是一个线程安全的单例:
KieServices kieServices = KieServices.Factory.get();
KieServices 是访问规则引擎其它服务的中心。
以创建 KieContainer 实例为例:
KieContainer kieContainer = kieServices.newKieClasspathContainer();
KieModule.xml
KieModule 是一个标准的 Java Maven 工程,包含了 pom.xml、kmodule.xml 和规则等必要资源。
KieModule 可以包含子 KieModule。
kmodule.xml内容分析
kmodule.xml 位于 src/main/resources/META-INF 目录下,定义了规则引擎如何加载工程中定义的规则。
一个空的 kmodule.xml 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
</code>
定义 kbase
- name KIEBase 名称
- includes 子 KIEBase 名称,多个使用逗号分隔
- packages 规则文件所在包路径,多个使用逗号分隔
示例:
<?xml version="1.0" encoding="UTF-8"?>
</code>
定义 ksession
- name KIESession 名称
- default 是否为默认 session,可选值:true false,默认值:false
- type 会话类型,可选值:stateful 有状态会话 stateless 无状态会话,默认值:stateful 有状态会话
示例:
<?xml version="1.0" encoding="UTF-8"?>
</code>
KieBase
知识仓库。
KieContainer
KieModule 及子 KieModule 所有 KieBase 的容器。
获取 KieContainer 的两种方式:
- 通过 classpath 加载规则
- 通过 Maven GAV 加载规则(使用 KIE CI)
KieSession
用于与规则引擎进行交互的会话。
会话分为两类:
- 有状态的 KieSession
- 无状态的 StatelessKieSession
KIESession
KIESession 会在多次与规则引擎进行交互中,维护会话的状态。
定义 KieSession,在 kmodule.xml 文件中定义 type 为 stateful 的 session:
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:
获取 StatelessKIESession 实例:
StatelessKieSession statelessKieSession = kieContainer.newStatelessKieSession("stateless_session");
通过 KieServices 获取 command 工厂类 KieCommands:
KieCommands commandFactory = kieServices.getCommands();
可以使用工程类 KieCommands 调用 newXXXCommand 开头的方法创建 command 实例。
会话执行 command:
statelessKieSession.execute(command);