篇幅中使用的Drools版本为6.3.0.Final,和5.x版本的API有较大区别,请留意
开发工具的设置
开发工具为Intellij IDEA,网上逛了很久都没有发现一个使用IDEA开发drools的说明
只找到了一个IDEA的设置文件,导入该文件后新建.drl文件的话会有drools规则语法的智能提示
下载地址
开发流程
maven
IDEA可以直接创建drools类型的项目,但是无法和maven很好的集成,建议直接新建maven项目用来开发,pom文件需要添加以下依赖:
<dependencies>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>6.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>6.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>6.3.0.Final</version>
</dependency>
</dependencies>
项目结构规范
drools项目的规则文件和kmodule.xml必须在main->resources文件夹中创建,其中kmodule.xml需要位于main->resources->META-INF目录下
否则运行的时候会出现无法找到资源文件,抛出空指针的异常
resources目录中,规则文件可以按照分类放在不同的目录中,其所在的目录就是kmodule.xml文件中引用的包名,如
main
=resources
==META-INF
===kmodule.xml
==rules1
===rule.drl
==rules2
===rule.drl
那么在kmodule.xml文件中的定义应该如下:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules1">
<ksession name="ksession-rules"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
</kmodule>
kbase中的packages就是resources文件夹下对应的规则所在的目录,kmodule.xml中具体的内容会在之后的实践中解释
规则文件编写
有关drools规则文件的语法说明请参考:
Drools5规则引擎开发教程
这是一篇很详细的教程,为drools5.x的版本,其中代码部分的API在6.x中已经不兼容,但是规则文件的编写说明是通用的,可以参考借鉴
下面给出一个简单的规则文件示例:
package info.xiaohei.www.rules
//导入自定义的实体类
import info.xiaohei.www.Message
//规则名
rule "Hello World"
//条件语句
when
//当该实体的status属性为HELLO的时候,将该实体赋值给m,实体的message属性赋值给printMsg
m : Message( status == Message.HELLO, printMsg : message )
//满足条件之后要做的事情
then
//系统输出和重新设置实体属性
System.out.println( printMsg );
m.setMessage( "Goodbye~" );
m.setStatus( Message.GOODBYE );
//更新实体,会重新触发规则
update( m );
end
//第二个规则
rule "GoodBye"
when
Message( status == Message.GOODBYE, printMsg : message )
then
System.out.println( printMsg );
end
实体类的定义如下:
package info.xiaohei.www;
public class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
Java API
6.x版本中引入了一个Kie的概念,会在之后的实践中详细介绍,以下为示例代码
public static void main(String[] args){
//从工厂中获得KieServices实例
KieServices kieServices = KieServices.Factory.get();
//从KieServices中获得KieContainer实例,其会加载kmodule.xml文件并load规则文件
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//建立KieSession到规则文件的通信管道
KieSession kSession = kieContainer.newKieSession("ksession=rules");
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
//将实体类插入执行规则
kSession.insert(message);
kSession.fireAllRules();
}
作者:@小黑