当前位置:今日智造 > 智造快讯 > 热门直播 > MES

spring boot使用drools规则引擎

2017/6/27 16:42:35 人评论 次浏览 来源:愚猿 分类:MES

配置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缓存起来

免责声明:本文系网络转载,版权归原作者所有,如涉及版权,请联系我们删除,QQ:1138247081!

共有条评论 网友评论

验证码: 看不清楚?