MyDroolsConfiguration.java
8.77 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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.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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Drools 6配置类。
*/
@Configuration
public class MyDroolsConfiguration {
/** 日志记录器 */
private static final Logger logger = LoggerFactory.getLogger(MyDroolsConfiguration.class);
/**
* 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
* TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
*/
@Bean(name = "coreKBase")
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/functions.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/functions.drl"), "UTF-8"));
kfs.write("src/main/resources/shiftloop_fb_2.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/shiftloop_fb_2.drl"), "UTF-8"));
kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/ttinfo.drl"), "UTF-8"));
kfs.write("src/main/resources/ttinfo2.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/ttinfo2.drl"), "UTF-8"));
kfs.write("src/main/resources/plan.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/plan.drl"), "UTF-8"));
kfs.write("src/main/resources/rerun.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/rerun.drl"), "UTF-8"));
kfs.write("src/main/resources/validplan.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/validplan.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());
// if (results.hasMessages(Message.Level.ERROR)) {
// logger.info("构建drools6错误:" + results.getMessages());
// return null;
// }
// 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;
}
/**
* 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
* TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
*/
@Bean(name = "preKBase")
public KieBase myKieBase2() {
// 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("KBase2")
.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/ruleWrap.drl", kieServices.getResources()
.newInputStreamResource(this.getClass().getResourceAsStream(
"/rules/ruleWrap.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());
// if (results.hasMessages(Message.Level.ERROR)) {
// logger.info("构建drools6错误:" + results.getMessages());
// return null;
// }
// 5、获取KieContainer
// TODO:ReleaseId用处很大,以后再议
ReleaseId releaseId = kieServices.getRepository().getDefaultReleaseId();
KieContainer kieContainer = kieServices.newKieContainer(releaseId);
// 6、创建kbase
KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();
KieBase kieBase = kieContainer.newKieBase("KBase2", kieBaseConfiguration);
return kieBase;
}
}