一、KIE的圈子
初步接触Drools,肯定会看到KieContainer、KieSession之类的带有kie标识的方法类名词,kie作为Drools和JBPM的共享核心,它的主要作用在于提供了一体化的方法模型去供给应用中的部署生成环节。
KIE(Knowledge is everything),从官方给出的文档上看出它的生态圈包含以下内容:
OptaPlanner:一个规划引擎,注意,规划引擎,它的定位是寻找最优计划,不是定时任务的规划,作为拥有Drools和JBPM却又独立于两者的工具,强力作用于搜索优化,比如路线规划 、资源分配等类似场景,Opta作为一个纯java开发的轻量化调优工具,完全适配jvm,用上Opta,新手开发人员也不必头疼资源分配场景的分配优化了。
Drools:规则引擎,参考链接 Drools规则引擎。
UberFire:UberFire主要作用于JBoss的开发,是原来的工作台废弃之后重新写的一个,提供满满的插件去构建业务中心。
Guvnor:主要说下最新的,6.x的版本Gnvnor已经缩小到封装UberFire的插件集合,这些东西也是给IDE提供服务的,举个例子:maven仓库依赖管理。
KIE-WB:这玩意不存在,想象出来的。可能未来会开发一个这样的超级工作台,集成所有Guvnor、Drools和JBPM。
二、KIE的定位
KIE作为所有工程的基础,定位在于提供公共的接口,具体的实现和使用方式可能在不同工程中有所区别,但是从它内部的接口来看,所有旗下的项目有着不同但是仍然存在联系的,未来未必不会出现一个超级项目,以KIE为基础,封装或者串行所有子项目,比如SpringBoot集成所有Spring配置,一个注解调用所有,从而演化出一个超级工程架构。注意KIE在各个工程中构建、生成等的生命周期和JAVAEE的其他项基本没有区别,从头掺和到尾。
三、KIE服务器
KIE服务器是随项目提供的服务器,如果是写的Drools项目(不是java,纯Drools项目,KJar文件),运行时间部署到KIE服务器,通过实例化的KIE容器使用。
如果没有使用KIE服务器,想要将kjar正常部署的JAVA程序,打包程序到一个war包里面就行了,这样部署的时候会产生一个类似KIE服务器的部署单元,也能用。
四、KIE API和KIE服务器API
KIE API和KIE服务器API这两个肯定不同,要不也不会单独拉个标题。KIEAPI提供最底层的各个子项目可以调用的接口,这些接口可以在子项目中具体实现复写,特殊化实现项目需求。一般自动以API可以和核心KIE API做交互执行嵌入式引擎中数据取用。
KIE服务器API就纯纯字面意思,针对服务器的应用性API。这个不介绍了,运维的活。
五、KIE库
在6.x版本中,KIE库不是使用构建器的方法构建了(也能用,麻烦),现在6.x版本直接上maven依赖,现在的KIE的项目模块只是一个maven结构的java module,依赖的基本使用参考Drools规则引擎,简单的应用实现。
1. kmodule文件
6.x版本虽然一个maven依赖就可以调用KIE库,但是,必须要写一个kmodule.xml文件,哪怕文件是空的,没有定义KieBase,KieSession,KieContainer这些配置。如果没有写配置,maven依赖内部的KIE库有自定义的default,遵从类似SpringBoot配置的自定义配置优先原则,有了就用,没有就用默认的。
另外,除了手动在resources下编写kmodule.xml配置文件,还有一个方法,Kie提供了一个fluent API,可以自定义实现kieModule,通过编程方式创建文件,就不用在resources下创建kmodule.xml文件了。
举个例子:
目录结构:
impl:
drl:
主要实现代码解析
public static void main(String[] args) {
// 获取一个kieServices
KieServices kieServices = KieServices.Factory.get();
// 新建一个kmodule代替原来的kmodule.xml文件
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
// 下面两块是创建kieBase和kieSession,里面还有很多的配置,可以自己研究
KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("KBase1")
.setDefault(true);
kieBaseModel.newKieSessionModel("KSession1")
.setDefault(true);
// kie文件系统
KieFileSystem kfs = kieServices.newKieFileSystem();
// 这两句可以直接写成 kfs.writeKModuleXML(kieModuleModel.toXML())
// 单独提出来是为了看一下xml文件
String kieModuleModelXML = kieModuleModel.toXML();
kfs.writeKModuleXML(kieModuleModelXML);
//将kmodule和drl文件关联起来
kfs.write(kieServices.getResources().newClassPathResource("rules/test.drl"));
// 构建一下kfs
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs);
kieBuilder.buildAll();
//到这一步就和之前的drools一样了
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
kieContainer.getKieBase("KBase1");
KieSession kieSession = kieContainer.newKieSession("KSession1");
Cus cus = new Cus();
cus.setMoney(BigDecimal.valueOf(100));
kieSession.insert(cus);
kieSession.fireAllRules();
kieSession.dispose();
System.out.println(cus.getMoney());
}
测试结果:
kieSession、kieBase、kieContainer这几个作为存储定义或者其他作用的东西,正常使用就行,没有什么需要特别注意的。
2. 事件监听器
除了原生的几种外,Drools还提供了Debug类型的监听器,可以打印需要的信息
runtimeLogger则是提供日志需求,完成运行时间的日志输出,记录应用程序的执行情况用以后续的检查。
3. Command命令
KIE本身已经可以使用标准的KieRuntime会话去做一些数据收集,但是在某些特殊情况下需要做特定的数据返回,这时间就非常有必要使用runtime下的commandExecutor接口,用于返回执行结果。
可以使用CommandFactory构造相关数据。