根据需要,需要对系统已经使用的Drools进行版本升级,之前一直使用的是6.4版本的Drools,确实有点老了,而且API已经开始提示过期了。所以需要对API进行升级,因为是在生产中使用,所以决定在drools中选择最新最稳定的版本7.12,但是API发生了很大的变化,很多类的命名都已经改变,但是引用没变还是Kie-api,所以问题不大,我们按照API文档配置还是很容易的,下面我们来整理一下核心的关键类说明。Drools默认使用kmodule.xml来构建KieContainer,这样的话我们必须要写一个配置文件,这样的话动态新增修改就比较困难了,所以我们希望有通过代码来灵活定义的方式,有没有呢?答案是肯定的。所以们就通过代码的方式动态来定义KieContainer。
//1.获取一个KieServices
KieServices kieServices = KieServices.Factory.get();
//2.创建kiemodule xml对应的class
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
//3.创建KieFileSystem虚拟文件系统
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
//4.添加具体的KieBase标签
KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("kbase").
addPackage("myPackage");//kie fileSystem 中资源文件的文件夹
//<KieBase></KieBase>标签添加KieSession属性
kieBaseModel.newKieSessionModel("kiession");//a
//5.添加kiemodule.xml文件到虚拟文件系统
String kieModuleModelXml = kieModuleModel.toXML();
kieFileSystem.writeKModuleXML(kieModuleModelXml);//kieModuleModel
//6.把规则文件加载到虚拟文件系统
Resource resource = ResourceFactory.newClassPathResource(ruleFile, "UTF-8");
//这里是把规则文件添加到虚拟系统,第一个参数是文件在虚拟系统中的路径
kieFileSystem.write(resource);
//7.构建所有的KieBase并把所有的KieBase添加到仓库里
kieServices.newKieBuilder(kieFileSystem).buildAll();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());//创建kie容器
//8.从容器中获取一个会话,这里和a处添加的是一个key,否则找不到 找不到任何一个会报异常
KieSession kieSession = kieContainer.newKieSession("kiession");
private KieBase buildKieBase(String[] rules) {
KieServices kieServices = KieServices.Factory.get();
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase").setDefault(true)
.setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
.setEventProcessingMode(EventProcessingOption.STREAM);
kieBaseModel1.newKieSessionModel("KSession").setDefault(true).setType(KieSessionModel.KieSessionType.STATEFUL)
.setClockType(ClockTypeOption.get("realtime"));
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.writeKModuleXML(kieModuleModel.toXML());
for (int i = 0; i < rules.length; i++) {
String ruleFile = rules[i];
kfs.write(ResourceFactory.newClassPathResource(ruleFile, "UTF-8"));
}
kieServices.newKieBuilder(kfs).buildAll();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kbase = kieContainer.getKieBase();
this.kBase = kbase;
return kbase;
}