一个星期前,经理要求用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的源码,只是各种原因没能再深入了解了,只能到这里告一段落了。
相关推荐
dools是一款开源规则引擎,drools-workbench是它的工作台web程序,可以编译,打包,发布规则,kie-server是可以运行规则的服务器程序, 两个服务单独部署,用户可以通过通过http请求发送数据,然后返回规则额匹配...
dools是一款开源规则引擎,drools-workbench是它的工作台web程序,可以编译,打包,发布规则,kie-server是可以运行规则的服务器程序, 两个服务单独部署,用户可以通过通过http请求发送数据,然后返回规则额匹配...
drools 的Drools Workbench 运行时所需jar包
tomcat8.5 部署 Workbench 和 kie-server ,除了 war包,其他都有了,由于上传受限,请自行下载,或我的其他文件资源,请不要下载另一个只包含jars的资源了
快速流口水介绍fast-drools-spring-boot-starter将Drools与Springboot集成在一起,为规则配置和管理提供了更有效,更复杂的模型。 它能够动态更新有关热部署的规则。联系请随时与以下联系人询问我任何问题。 Drools...
亲测可运行,Drools Workbench6.5.0Final版!亲测可运行,Drools Workbench6.5.0Final版 !
drools的workbench平台与kie-server的整个打包,通过tomcat8运行,搞了两天终于搞好了,drools-7.7.0目前界面显示还有问题,因此通过drools-7.5.0版本来运行,服务启动后可以通过代码的方式发送命令来执行规则引擎
drools 的Drools Workbench 运行时所需jar包 copy following libs into TOMCAT_HOME/lib * btm-2.1.4.jar * btm-tomcat55-lifecycle-2.1.4.jar * h2-1.3.161.jar * jta-1.1.jar * slf4j-api-1.7.2.jar * slf4j...
drools tomcat workbench 安装war包。 drools tomcat workbench 安装war包。
dools是一款开源规则引擎,drools-workbench是它的工作台web程序,可以编译,打包,发布规则,kie-server是可以运行规则的服务器程序,用户可以通过通过http请求发送数据,然后返回规则额匹配结果。由于网上很多入门...
kie-drools-wb安装所需jar包
drools-distribution-7.9.0.Final&spring;-drools-demo样例
drools workbench和kie-server完全配置文件和启动文件.傻瓜式啓動
drools-templates-5.4.0.Final.jar