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_第1张图片Drools6 基本使用 -- 1_第2张图片

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

Drools6 基本使用 -- 1_第3张图片

输入project name

Drools6 基本使用 -- 1_第4张图片

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

Drools6 基本使用 -- 1_第5张图片

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

Drools6 基本使用 -- 1_第6张图片

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

Drools6 基本使用 -- 1_第7张图片

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)



    
        
    

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
			
		
	

这里特别提一下kie-maven-plugin,官方文档说加入这个可以帮助预编译rules防止rules语法错误,虽然我觉得打包之前只要做够测试就不太可能出现这种问题,还是保留它。

今天先到这里,下次写添加测试类,deploy jar,以及在其他项目里面如何使用rules jar

你可能感兴趣的:(JEE,Java)