当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
随机推荐
selenium learning
input detailed file upload
In-depth Zabbix user guide - from the green boy
flink cdc 目前支持Gauss数据库源吗
[Problem has been resolved]-Virtual machine error contains a file system with errors check forced
H5开发调试-Fiddler手机抓包
VLAN介绍与实验
原生JS带你了解数组方法实现及使用
通过反射获取Class对象的四种方式
Into the pre-service, thought they play so flowers
错误类型:反射。ReflectionException:无法设置属性“xxx”的“类”xxx”与价值“xxx”
What are some things that you only know when you do operation and maintenance?
From "dual card dual standby" to "dual communication", vivo took the lead in promoting the implementation of the DSDA architecture
Quick question and quick answer - FAQ of Tencent Cloud Server
System basics - study notes (some command records)
BIO,NIO,AIO实践学习笔记(便于理解理论)
el-autocomplete use
Passing parameters in multiple threads
干货!教您使用工业树莓派结合CODESYS配置EtherCAT主站
[ingress]-ingress exposes services using tcp port