当前位置:网站首页>Drools规则引擎快速入门(一)
Drools规则引擎快速入门(一)
2022-08-05 05:25:00 【用户昵称23】
目录
第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包
第二步:根据drools要求在maven项目目录下创建?resources/META-INF/kmodule.xml
第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:
一、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目录下
点击plugins插件市场中搜索安装drools插件 ,如图
二、drools规则引擎开发实现的具体步骤如下:
三、drools快速入门
业务场景描述
用户消费的金额对应赠送的积分规则情况如下:
//消费100元以下 不加分
//消费100元-500元 加100分
//消费500元-1000元 加500分
//消费1000元以上 加1000分
四、开发实现
第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包
第二步:根据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目录下的所有(包含子目录)规则文件。
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("规则执行完成,关闭规则");
}
}
测试代码中按照注解描述的步骤逐一编写,执行代码得出如下结果:
看到对应规则输出表示案例测试成功
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- LinkSLA insists that users come first and creates a sustainable operation and maintenance service plan
- 教您简单几步实现工业树莓派正确安装RS232转USB驱动
- 数组&的运算
- Browser Storage for H5
- 路由器和静态路由的配置
- transport layer protocol
- DevOps流程demo(实操记录)
- 网络层协议介绍
- Transformer详细解读与预测实例记录
- Problems encountered in installing Yolo3 target detection module in Autoware
猜你喜欢
Transformer详细解读与预测实例记录
BIO,NIO,AIO实践学习笔记(便于理解理论)
Introduction to Network Layer Protocols
Cloud Computing Basics - Study Notes
selenium模块的操作之拉钩
selenium学习
5分钟完成mysql离线安装
LeetCode practice and self-comprehension record (1)
selenium learning
Teach you simple steps to achieve industrial raspberries pie properly installed RS232 USB drive
随机推荐
In-depth Zabbix user guide - from the green boy
Seven Ways to Center a Box Horizontally and Vertically
Browser Storage WebStorage
Transformer interprets and predicts instance records in detail
vs2017关于函数命名方面的注意事项
selenium learning
浏览器兼容汇总
多行文本省略
One-arm routing experiment and three-layer switch experiment
RAID disk array
请问下通过flink sql读取hologres 的两张表的 binlog,然后如何进行join?
input详解之文件上传
Q 2020, the latest senior interview Laya soul, do you know?
DevOps-了解学习
Quick question and quick answer - FAQ of Tencent Cloud Server
Network wiring and digital-to-system conversion
The use of three parameters of ref, out, and Params in Unity3D
[ingress]-ingress使用tcp端口暴露服务
Collection of error records (write down when you encounter them)
Next-Generation Parsing Technology - Cloud Parsing