搭建Drools开发环境

篇幅中使用的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();
}

作者:@小黑

你可能感兴趣的:(idea,drools)