目录
一、Drools环境集成
二、drools规则引擎开发实现的具体步骤如下:
三、drools快速入门
四、开发实现
第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包
第二步:根据drools要求在maven项目目录下创建 resources/META-INF/kmodule.xml
第三步:创建订单实体类Order
第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:
第五步:编写测试类TestDrools。
在项目中集成使用drools时,既可以独立使用也可以整合spring使用,如果是单独使用直接引入maven依赖包:如下
org.kie
kie-spring
7.68.0.Final
org.drools
drools-compiler
7.68.0.Final
如果使用的开发工具是IDEA,那么在file->setting目录下
点击plugins插件市场中搜索安装drools插件 ,如图
业务场景描述
用户消费的金额对应赠送的积分规则情况如下:
//消费100元以下 不加分 //消费100元-500元 加100分 //消费500元-1000元 加500分 //消费1000元以上 加1000分
需要有一个配置文件告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml
注意:配置文件中的名称和位置都是固定写法,不能更改
Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。
kbase需要一个唯一的name,可以取任意字符串。
packages为drl文件所在resource目录下的路径。注意分区drl文件中的package与此处的package不一定相同。多个包用逗号分隔,默认情况下会扫描resources目录下的所有(包含子目录)规则文件。
kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以直接查找到该KieBase,但每个module最多只能有一个默认的KieBase。
kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。
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 +
'}';
}
}
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
情况一: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规则引擎快速入门(二)_爱编码阿信的博客-CSDN博客