MyDroolsConfiguration.java
4.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.bsth.service.schedule.rules;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.builder.Message;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Drools 6配置类。
*/
@Configuration
public class MyDroolsConfiguration {
/**
* 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
* TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
*/
@Bean
public KieBase myKieBase() {
// Drools 6开始引入kie统一接口(jboss的jbpm工作流也使用kie接口了),整个定义方式和5差别很大
// 这里使用全api方式创建知识库对象,不使用xml的方式,提供最大的灵活性
// 1、创建kieservices
KieServices kieServices = KieServices.Factory.get();
// 2、创建KieModuleModel,默认是由kmodule.xml的方式创建,这里使用api方式闯将
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
// 2.1、创建KieBaseModel,类似kmodule.xml中的kbase标签
KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase1")
.setDefault(true)
.setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
.setEventProcessingMode(EventProcessingOption.STREAM);
// 2.2、创建与kbase关联的KieSessionModel,类似kmodule.xml中的kbase内的ksession标签
kieBaseModel1.newKieSessionModel("KSession1")
.setDefault(true)
.setType(KieSessionModel.KieSessionType.STATEFUL)
.setClockType(ClockTypeOption.get("realtime"));
// 3、创建KieFileSystem,将模型xml,drl等写入,TODO:以后考虑从数据库中获取
KieFileSystem kfs = kieServices.newKieFileSystem();
// 3.1、写入KieBaseModel(内部包含了KieSessionModel的内容了,注意之前的KieSessionModel的创建方式)
kfs.writeKModuleXML(kieModuleModel.toXML());
// 3.2、写入drl(写法超多,有点混乱)
// 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入
// 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的
kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/HelloWorld.drl"), "UTF-8"));
kfs.write("src/main/resources/shiftloop.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/shiftloop.drl"), "UTF-8"));
kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/ttinfo.drl"), "UTF-8"));
// TODO:还有其他drl....
// 4、创建KieBuilder,使用KieFileSystem构建
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR))
throw new IllegalStateException("构建drools6错误:" + results.getMessages());
// 5、获取KieContainer
// TODO:ReleaseId用处很大,以后再议
ReleaseId releaseId = kieServices.getRepository().getDefaultReleaseId();
KieContainer kieContainer = kieServices.newKieContainer(releaseId);
// 6、创建kbase
KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();
KieBase kieBase = kieContainer.newKieBase("KBase1", kieBaseConfiguration);
return kieBase;
}
}