Drools规则引擎快速入门(一)

目录

一、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依赖包:如下

    
      org.kie
      kie-spring
      7.68.0.Final
    
    
      org.drools
      drools-compiler
      7.68.0.Final
    

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

Drools规则引擎快速入门(一)_第1张图片

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

Drools规则引擎快速入门(一)_第2张图片

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

Drools规则引擎快速入门(一)_第3张图片

三、drools快速入门

业务场景描述

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

//消费100元以下 不加分

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

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

//消费1000元以上 加1000分

 四、开发实现

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

Drools规则引擎快速入门(一)_第4张图片

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

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




    
    
        
        
    

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

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

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

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

Drools规则引擎快速入门(一)_第5张图片

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("规则执行完成,关闭规则");
    }
}

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

Drools规则引擎快速入门(一)_第6张图片

看到对应规则输出表示案例测试成功 

​​​​​​​Drools规则引擎快速入门(二)_爱编码阿信的博客-CSDN博客

你可能感兴趣的:(后端,架构)