为了系统能够动态响应业务逻辑的变化,需要引入规则引擎,之前用过Drools,找回它,发现Drools一直都在进化,版本6和5也有挺大差别了,文档和code sample都非常详细,感觉做的非常不错。
Note:Code link:https://github.com/droolsjbpm/drools 里面有很多sample api,还有很多junit test可以了解怎么使用Drools
Drools6给我的最大不同就是把rules打包成jar,使用端通过kie-ci来动态从maven repo中获取指定rules jar版本,虽然和maven有紧耦合,在网上也看到了很多人说不喜欢,项目没有maven之类的,不过我觉得简化以及清晰了rules的使用和动态升级:系统建立2个项目:一个Drools项目来实现规则,验收规则,生成jar包,另外一个就是真正要用规则的项目,直接通过引入不同版本的jar包实习规则动态升级。
看到有人在评论里面说我抄袭翻译,贴出我自己的Github代码,我确实是参考drools官网的资料学习的,知识有限,能力有限,有很多不专业的地方,请互相尊重,别随便污蔑人。谢谢!
https://github.com/elulian/CustomerSecurityManagementSystem/tree/master/CustomerSecurityManagementRules
下面介绍一下我基于这种想法做的sample实践:
Note:Drools有整合eclipse的IDE,不过我还没有用到它的复杂功能,所以我只是使用了eclipse+ drools plugin
1. 安装eclipse jee version
2. 从eclipse help->install new software, 安装drools插件 (我这里用的是6.1.0 beta3 http://download.jboss.org/drools/release/6.1.0.Beta3/org.drools.updatesite/)
3. 安装完插件之后重启,从eclipse new 一个drools project
输入project name
这个时候可以通过点击configure workspace settings,来创建drools runtime,选好runtime之后,groupid/artifact/id/version随意填写
选择下载的drools文件夹路径作为drools runtime路径
直接点击finish,这样一个包含sample的hello world的drools工程就创建好了。
4. 可以看出,drools project就是一个maven project,在src/main/java里面有个DroolsTest java文件
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
kSession.insert(message);
kSession.fireAllRules();
这里可以看出 kie框架先初始化一个kieservice对象,然后从classpath中读取kmodule,创建KieContainder, 从而获取KieSession来对Fact(message对象)执行规则(fireAllRules)
5. 在src/main/resources下面有个rules folder,里面有具体的rules.drl(具体规则定义文件),同时有个meta-inf folder,里面有个maven folder和一个kmodule.xml的配置文件,maven folder里面有个pom.properties,这个properties是因为新版本的drools依靠maven来区分不同的kmodule从而实习方便的动态rules upgrade,打开pom.properties,可以看到groupid/artifact/id/version都没有值,把它们改成如下:
groupId=${project.groupId}
artifactId=${project.artifactId}
version=${project.version}
6. kmodule.xml就是kieservice从classpath需要读取的kmodule配置文件,这个配置文件决定了kession的类型,名称,rules文件所在文件夹(kbase packages)
kession有stateless和stateful的区别,从drools官方说法除了处理大数据,stateless和stateful没有大区别,从code看stateless的实现就是使用了stateful。。。使用哪种由ksession的type属性决定,默认ksession是stateful的,如果想使用stateless的ksession,可以修改kmodule.xml ksession行如下:
type="stateless" />
同时代码中也要改成使用statelsskiesession,并且不用fireAllRules,改成调用exeucte方法
kContainer.newStatelessKieSession("ksession-rules")
7.修改项目的pom.xml,加入以下信息到pom.xml,同时加入$属性定义到pom文件
org.drools
drools-core
org.drools
drools-compiler
org.drools
knowledge-api
org.drools
drools-decisiontables
org.drools
drools-jsr94
org.slf4j
slf4j-simple
${project.slf4j-simpleVersion}
junit
junit
log4j
log4j
install
org.kie
kie-maven-plugin
${project.kiePluginVersion}
true
今天先到这里,下次写添加测试类,deploy jar,以及在其他项目里面如何使用rules jar