首页 > 编程语言 > 详细

Drools(kie-spring)

时间:2016-03-17 02:20:54      阅读:633      评论:0      收藏:0      [点我收藏+]

?????? 一个星期前,经理要求用drools,能动态的更改佣金规则。

?????? 我上网搜索了一下,drools现在稳定版本到了6.3.0.Final了,我看官网推荐使用kie-spring。我辣么耿直的人果断就使用了。后来就后悔了,国内用kie-spring的真少,英文又不怎么好的我,需要经常看文档(表现为经常加班,熬夜)。好了,废话不多说,进入正题

??????? 第一步:使用maven导入jar包,在maven中央库http://search.maven.org/搜索kie-spring和drools

????????????? <dependency>

?????????? <groupId>org.drools</groupId>

?????????? <artifactId>drools-core</artifactId>

?????????? <version>6.3.0.Final</version>

?????? </dependency>

?????? <dependency>

?????? ??? <groupId>org.kie</groupId>

?????? ??? <artifactId>kie-spring</artifactId>

?????? ??? <version>6.3.0. Final</version>

?????? </dependency>

????

第二步,新建spring-drools.xml

?????? <kie:kmodule id="kmodule1">

?????? ? <kie:kbase name="kbase1" packages="drools.rules" ><!—父级和子级目录用 . -->

?????? ??? <kie:ksession name="ksession1"><!—这个kie:ksession可以不写 -->

?????? ??? ?????? <kie:consoleLogger/>

?????? ??? </kie:ksession>

?????? ? </kie:kbase>

?????? </kie:kmodule>

?????? <bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor"/>

???

?????? 注意:其中KModuleBeanFactoryPostProcessor这个bean一定得注解,

详细介绍请看https://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html/ch.kie.spring.html

?

第三步,写rules文件

??????????

?????? package com.sample

?

import com.sample.DroolsTest.Message;

?

rule"Hello World"

??? when

??????? m : Message( status == Message.HELLO, myMessage : message )

??? then

??????? System.out.println( myMessage );

??????? m.setMessage( "Goodbye cruel world" );

??????? m.setStatus( Message.GOODBYE );

??????? update( m );

end

?

rule"GoodBye"

??? when

??????? Message( status == Message.GOODBYE, myMessage : message )

??? then

??????? System.out.println( myMessage );

end

??????

因为不能贴项目代码,所以用helloworld,并且假设你们知道rules规则,

?????? 不知道的请看http://docs.jboss.org/drools/release/6.3.0.Final/drools-docs/html/index.html

第四步:

?????? Junit4测试

?????????????? 在类名前加上注解

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:drools/spring-drools.xml")

?

注解该属性

@Autowired

private KieBase kbase;

?

?????? @Test

?????? publicvoid test(){

?????? KieSession kSession = kbase.newKieSession();

?????? //Object obj;一个赋值的java对象

?

?????? kSession.insert(obj);

?????? kSession.fireAllRules();

}

?

Main方法

@SuppressWarnings("resource")

publicstaticvoid main(String[] args) {

ClassPathXmlApplicationContext context =

new ClassPathXmlApplicationContext( "drools/spring-drools.xml" );?

???????????//Object obj;一个赋值的java对象

StatefulKnowledgeSession kSession = (StatefulKnowledgeSession) context.getBean( "ksession1" );

??? kSession.insert(obj);

??? kSession.fireAllRules();

???????

}

?

?

补充:

?????? 这次开发我遇到一个坑

?????? rules时,有这样一个需求,

?????? if(最外面一层){

??????????????? ?if(里面一层){

????????????????????

?? }

?? if(里面二层){

?

?? }

???????? ……

? }

? ……

rule"TOKEN A"

??? salience 99

??? agenda-group"TOKEN A"

??? auto-focustrue

??? when

?????? BrokerageBean( typeList.size() == 1 )

??? then

?????? kcontext.getKnowledgeRuntime().getAgenda().getAgendaGroup("TOKEN A1").setFocus();//

?????? kcontext.getKnowledgeRuntime().getAgenda().getAgendaGroup("TOKEN A2").setFocus();//

end

?

?

rule"TOKEN A1"

??? salience 99

??? agenda-group"TOKEN A1"

??? when

?????? $BB : BrokerageBean( $typeList : typeList )

?????? $TIB : TypesOfInsuranceBean( typeId == 1) from $typeList

?????? InsuranceBean( id == 3 ) from $TIB.insuranceList

?????? //exists ( $TIB : TypesOfInsuranceBean( typeId == 1) from $typeList

?????? //and InsuranceBean( id == 3 ) from $TIB.insuranceList )

??? then

?????? DefaultDroolsRules.log.info("执行-----------TOKEN A1");

?????? //$BB.setInsuranceRate("32","0","0");

?????? DefaultDroolsRules.setBb($BB,32,0);

end

?

rule"TOKEN A2"

??? salience 99

??? agenda-group"TOKEN A2"

??? when

?????? $BB : BrokerageBean( $typeList : typeList )

?????? TypesOfInsuranceBean( typeId == 1) from $typeList

?????? //exists ( TypesOfInsuranceBean( typeId == 1) from $typeList )

??? then

?????? DefaultDroolsRules.log.info("执行-----------TOKEN A2");

?????? //$BB.setInsuranceRate("24","0","0");

?????? DefaultDroolsRules.setBb($BB,24,0);

End

?

我期望是TOKEN A1 TOKEN A2都能触发,但结果是只有TOKEN A2触发了,我调换了下的位置,发现只有TOKEN A1触发了,这有点“堆”的意思。

我搜了一下官网上的解决方案,用exists,发现还不行,网上各种找,都没找到,就这样要放弃。然后项目讨论,不需要这个DefaultDroolsRules这个工具类的静态方法,所以,我换成$BB.setInsuranceRate("24","0","0");,然后一运行,发现运行结果按照我原本预想那样。

?

突然之间对drools的源码很感兴趣,想研究下drools的源码,只是各种原因没能再深入了解了,只能到这里告一段落了。

?

?

?

?

?

???????????????

Drools(kie-spring)

原文:http://995998760.iteye.com/blog/2283434

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!