配置kmodule.xml文件:
此文件是drools的入口文件,drools默认会查找位于classpath:META-INF/kmodule.xml文件
此文件里包含kbase、ksession的描述
可以有多个kbase,drools根据每个kbase对应的package去扫描对应的规则文件(*.drl)
kbase的name只是个名字
使用的时候需要根据ksession的name去创建执行规则的session
<?xml version="1.0" encoding="UTF-8"?><kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="dataRules" packages="com.itopener.drools.data"><ksession name="ksession-data"/></kbase></kmodule>
创建KieContainer
每个应用只能创建一个KieContainer对象的实例
KieContainer kieContainer = KieServices.Factory.get().getKieClasspathContainer();
规则文件的验证
kieContainer对象包含了对规则的验证结果
Results results = kieContainer.verify();if(results.hasMessages(Message.Level.ERROR)){StringBuffer sb = new StringBuffer();for (Message mes:results.getMessages()) {sb.append("解析错误的规则:").append(mes.getPath()).append(" 错误位置:").append(mes.getLine()).append(";");}throw new RuntimeException(sb.toString()); }
创建执行规则的session
参数是session的名称,必须与kmodule.xml里的ksession的name一致
KieSession kieSession = kieContainer.newKieSession("ksession-data");
放入要进行规则判断的对象(Fact)
Message message = new Message();message.setMessage("Hello World");message.setStatus(Message.HELLO); kieSession.insert(message);
执行所有规则
返回值是执行的规则数量
int result = kieSession.fireAllRules();
规则文件(*.drl)的语法
参见:http://www.360doc.com/content/15/1116/16/16002580_513612029.shtml
封装成spring boot starter
增加properties配置文件:
@ConfigurationProperties(prefix="spring.drools")public class DroolsProperties {private String dateformat = "yyyy-MM-dd HH:mm:ss";public String getDateformat() {return dateformat;}public void setDateformat(String dateformat) {this.dateformat = dateformat;} }
增加自动配置类
@Configuration@EnableConfigurationProperties(DroolsProperties.class)public class DroolsAutoConfiguration {@Autowiredprivate DroolsProperties droolsProperties;@Beanpublic KieContainer kieContainer(){System.setProperty("drools.dateformat", droolsProperties.getDateformat());KieContainer kieContainer = KieServices.Factory.get().getKieClasspathContainer();Results results = kieContainer.verify();if(results.hasMessages(Message.Level.ERROR)){?StringBuffer sb = new StringBuffer();for (Message mes:results.getMessages()) {?sb.append("解析错误的规则:").append(mes.getPath()).append(" 错误位置:").append(mes.getLine()).append(";");}throw new RuntimeException(sb.toString());}return kieContainer;} }
增加spring boot识别文件:META-INF/spring.factories
# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.itopener.drools.spring.boot.autoconfigure.DroolsAutoConfiguration
使用时注入KieContainer,创建session,执行规则
@Resourceprivate KieContainer kieContainer;@RequestMapping("exe") public ResultMap exe(){KieSession kieSession = kieContainer.newKieSession(ItopenerConstants.KSESSION_DATA);Message message = new Message();message.setMessage("Hello World");message.setStatus(Message.HELLO);kieSession.insert(message);System.out.println("fact count: " + kieSession.getFactCount());int result = kieSession.fireAllRules();System.out.println("rules result : " + result);return ResultMap.buildSuccess(); }
注意
如果加入了spring-boot-devtools的依赖,规则不会执行,原因未知,猜测与spring-boot-devtools两个ClassLoader的实现机制有关系
创建KieContainer消耗较大,但创建KieSession消耗叫小,所以官方建议将KieContainer缓存起来

共有条评论 网友评论