目录

一、Drools环境集成

二、drools规则引擎开发实现的具体步骤如下:

三、drools快速入门

 四、开发实现

第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

第二步:根据drools要求在maven项目目录下创建 resources/META-INF/kmodule.xml

第三步:创建订单实体类Order

第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

第五步:编写测试类TestDrools。


一、Drools环境集成

在项目中集成使用drools时,既可以独立使用也可以整合spring使用,如果是单独使用直接引入maven依赖包:如下

<dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-spring</artifactId>
      <version>7.68.0.Final</version>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>7.68.0.Final</version>
    </dependency>

如果使用的开发工具是IDEA,那么在file->setting目录下

groovy 规则引擎 demo drools规则引擎技术指南 pdf_规则引擎

点击plugins插件市场中搜索安装drools插件 ,如图

groovy 规则引擎 demo drools规则引擎技术指南 pdf_后端_02

二、drools规则引擎开发实现的具体步骤如下:

groovy 规则引擎 demo drools规则引擎技术指南 pdf_groovy 规则引擎 demo_03

三、drools快速入门

业务场景描述

用户消费的金额对应赠送的积分规则情况如下:

//消费100元以下 不加分

//消费100元-500元 加100分

//消费500元-1000元 加500分

//消费1000元以上 加1000分

 四、开发实现

第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

groovy 规则引擎 demo drools规则引擎技术指南 pdf_后端_04

第二步:根据drools要求在maven项目目录下创建 resources/META-INF/kmodule.xml

需要有一个配置文件告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

    <!--
    name:指定kbase的名称,可以任意,但是必须唯一
    packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
    default:指定当前kbase是否为默认
    -->
    <kbase name="SimpleRuleKBase" packages="rules">
        <!--
        name:指定ksession的名称,可以任意,但是必须唯一
        default:指定当前ksession是否为默认
        -->
        <ksession name="simpleRuleKSession"/>
    </kbase>
</kmodule>

注意:配置文件中的名称和位置都是固定写法,不能更改

Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。

kbase需要一个唯一的name,可以取任意字符串。

packages为drl文件所在resource目录下的路径。注意分区drl文件中的package与此处的package不一定相同。多个包用逗号分隔,默认情况下会扫描resources目录下的所有(包含子目录)规则文件。

groovy 规则引擎 demo drools规则引擎技术指南 pdf_System_05

kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以直接查找到该KieBase,但每个module最多只能有一个默认的KieBase。

kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。

第三步:创建订单实体类Order

package com.hx.rules.entity;

import lombok.Data;

@Data
public class Order {

    /**
     * 订单金额
     */
    private int amount;

    /**
     * 积分
     */
    private int score;

    @Override
    public String toString() {
        return "Order{" +
                "amount=" + amount +
                ", score=" + score +
                '}';
    }
}

第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

package rules;

import com.hx.rules.entity.Order;

//100元以下不加分
rule "score_1" //名称需唯一
when
$order:Order(amount < 100);
then
$order.setScore(0);
System.out.println("触发规则,100元以下不加分");
end

//100元-500元 加100分
rule "score_2"
when
$order:Order(100 < amount && amount< 500)
then
$order.setScore(100);
System.out.println("触发规则,100元-500元 加100分");
end
//500元-1000元 加500分
rule "score_3"
when
$order:Order(500 < amount && amount < 1000)
then
$order.setScore(500);
System.out.println("触发规则,500元-1000元 加500分");
end
//1000元以上 加1000分
rule "score_4"
when
$order:Order(1000 < amount)
then
$order.setScore(1000);
System.out.println("触发规则,500元-1000元 加500分");
end

第五步:编写测试类TestDrools。

情况一:module文件中kbase指定特定名称,并且default设置为true,测试类的代码如下:

package com.hx.rules;


import com.hx.rules.entity.Order;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestDrools {

    @Test
    public void test() {
        //第一步 获取KieServices
        KieServices kieServices = KieServices.Factory.get();
        //第二步获取kieContainer
        KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
        //第三步获取kieSession
        KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();
        //新建事实对象
        Order order = new Order();
        order.setAmount(235);
        //第四步 插入事实对象到session中
        simpleRuleKSession.insert(order);
        //第五步 执行规则引擎
        simpleRuleKSession.fireAllRules();
        //第六步 关闭规则引擎
        simpleRuleKSession.dispose();
        System.out.println("规则执行完成,关闭规则");
    }
}

注意: 

KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //第三步获取kieSession KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();

 两端代码中的container和kiesession无线指定name也能查找到KieBase

情况二:module文件中kbase指定特定名称,default未设置或者设置为false,测试类的代码如下:

package com.hx.rules;


import com.hx.rules.entity.Order;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestDrools {

    @Test
    public void test() {
        //第一步 获取KieServices
        KieServices kieServices = KieServices.Factory.get();
        //第二步获取kieContainer
        KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer("SimpleRuleKBase");
        //第三步获取kieSession
        KieSession simpleRuleKSession = kieClasspathContainer.newKieSession("simpleRuleKSession");
        //新建事实对象
        Order order = new Order();
        order.setAmount(235);
        //第四步 插入事实对象到session中
        simpleRuleKSession.insert(order);
        //第五步 执行规则引擎
        simpleRuleKSession.fireAllRules();
        //第六步 关闭规则引擎
        simpleRuleKSession.dispose();
        System.out.println("规则执行完成,关闭规则");
    }
}

测试代码中按照注解描述的步骤逐一编写,执行代码得出如下结果:

groovy 规则引擎 demo drools规则引擎技术指南 pdf_后端_06