天天看点

Drools6 基本使用 -- 1

为了系统能够动态响应业务逻辑的变化,需要引入规则引擎,之前用过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/)

Drools6 基本使用 -- 1
Drools6 基本使用 -- 1

3. 安装完插件之后重启,从eclipse new 一个drools project

Drools6 基本使用 -- 1

输入project name

Drools6 基本使用 -- 1

这个时候可以通过点击configure workspace settings,来创建drools runtime,选好runtime之后,groupid/artifact/id/version随意填写

Drools6 基本使用 -- 1

选择下载的drools文件夹路径作为drools runtime路径

Drools6 基本使用 -- 1

直接点击finish,这样一个包含sample的hello world的drools工程就创建好了。

Drools6 基本使用 -- 1

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