为了系统能够动态响应业务逻辑的变化,需要引入规则引擎,之前用过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}
这样可以直接使用pom中的相应信息。
6. kmodule.xml就是kieservice从classpath需要读取的kmodule配置文件,这个配置文件决定了kession的类型,名称,rules文件所在文件夹(kbase packages)
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
kession有stateless和stateful的区别,从drools官方说法除了处理大数据,stateless和stateful没有大区别,从code看stateless的实现就是使用了stateful。。。使用哪种由ksession的type属性决定,默认ksession是stateful的,如果想使用stateless的ksession,可以修改kmodule.xml ksession行如下:
<pre name="code" class="html"><ksession name="ksession-rules" <span style="font-family: Arial, Helvetica, sans-serif;">type="stateless" </span><span style="font-family: Arial, Helvetica, sans-serif;">/></span>
同时代码中也要改成使用statelsskiesession,并且不用fireAllRules,改成调用exeucte方法
kContainer.newStatelessKieSession("ksession-rules")
7.修改项目的pom.xml,加入以下信息到pom.xml,同时加入$属性定义到pom文件
<dependencies>
<!-- for drools -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>knowledge-api</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-jsr94</artifactId>
</dependency>
<!-- fix for SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
issue -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${project.slf4j-simpleVersion}</version>
</dependency>
<!-- for drools end -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.kie</groupId>
<artifactId>kie-maven-plugin</artifactId>
<version>${project.kiePluginVersion}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>这里特别提一下kie-maven-plugin,官方文档说加入这个可以帮助预编译rules防止rules语法错误,虽然我觉得打包之前只要做够测试就不太可能出现这种问题,还是保留它。
今天先到这里,下次写添加测试类,deploy jar,以及在其他项目里面如何使用rules jar
2581



被折叠的 条评论
为什么被折叠?



