1、首先引入drools依赖包
dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.7.0.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>7.7.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.7.0.Final</version>
</dependency>
2、编写执行规则通用方法
public class DroolsExecutorUtil {
/**
* 执行定义的规则
* @param bo 柜子模型
* @param rule 规则方法
* @param <T> 返回执行结果
* @return
* @throw Exception
*/
public static <T> T executeRule(T bo, String rule) throws Exception {
if(StringUtils.isEmpty(rule)){
return bo;
}
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
//以DRL形式加载规则
kb.add(ResourceFactory.newByteArrayResource(rule.getBytes(StandardCharsets.UTF_8)), ResourceType.DRL);
KnowledgeBuilderErrors errors = kb.getErrors();
for (KnowledgeBuilderError error : errors) {
throw new Exception("规则文件执行错误:"+ error.getMessage());
}
InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addPackages(kb.getKnowledgePackages());
//获取规则引擎会话session
KieSession kieSession = kBase.newKieSession();
//插入需匹配的对象
kieSession.insert(bo);
//执行规则
kieSession.fireAllRules();
//释放资源
kieSession.dispose();
return bo;
}
}
3、创建实体类Order
public class Order {
/**
* 订单原始价格(即优惠前的价格)
*/
private Double originalPrice;
/**
* 订单真实价格(即优惠后的价格)
*/
private Double realPrice;
......此处省略get/set方法
}
4、编写规则(以.drl文件形式编写)
package order.impl
import com.example.demo.test.Order
// 规则一:价格在100元以下,无优惠
rule "rule_1"
lock-on-active true
when
$order: Order(originalPrice < 100) // 匹配模式,到规则引擎中(工作内存)查找Order对象,命名为$order
then
$order.setRealPrice($order.getOriginalPrice());
update($order);
System.out.println("匹配到规则一,价格在100元以下,无优惠");
end
// 规则二:价格在100~200之间,优惠20元
rule "rule_2"
lock-on-active true
when
$order: Order(originalPrice >= 100 && originalPrice < 200)
then
$order.setRealPrice($order.getOriginalPrice() - 20);
update($order);
System.out.println("匹配到规则二,价格在100~200之间,优惠20元");
end
// 规则三:价格在200~300元之间,优惠50元
rule "rule_3"
lock-on-active true
when
$order: Order(originalPrice >= 200 && originalPrice < 300)
then
$order.setRealPrice($order.getOriginalPrice() - 50);
update($order);
System.out.println("匹配到规则三,价格在200~300元之间,优惠50元");
end
// 规则四:价格在300元及以上,优惠100元
rule "rule_4"
lock-on-active true
when
$order: Order(originalPrice >= 300)
then
$order.setRealPrice($order.getOriginalPrice() - 100);
update($order);
System.out.println("匹配到规则四,价格在300元及以上,优惠100元");
end
5、进行测试
public static void main(String[] args) throws Exception {
String rule = "";//此部分为上面写的规则,进行复制即可
Order order = new Order();
order.setOriginalPrice(160d);
System.out.println("匹配规则前优惠后价格:" + order.getRealPrice());
DroolsExecutorUtil.executeRule(order,rule);
System.out.println("优惠前价格:" + order.getOriginalPrice() + "\n优惠后价格:" + order.getRealPrice());
}
6、查看日志输出
匹配规则前优惠后价格:null
匹配到规则二,价格在100~200之间,优惠20元
优惠前价格:160.0
优惠后价格:140.0
介绍
package:package是必须定义的,必须放在规则文件第一行,package的名字可以是随意起的
import:导入规则文件需要使用到的外部规则文件或者变量
rule:定义一个具体规则,rule "ruleName",一个规则可以包含三个部分:
属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。
条件部分(LHS):定义当前规则的条件,如 when Message(); 判断当前workingMemory中是否存在Message对象。
结果部分(RHS):即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。这里可以写普通java代码。
rule "ruleName"
no-loop true
when
$message:Message(status == 0)
then
System.out.println("fit");
$message.setStatus(1);
update($message);
end
属性详情
no-loop:定义当前的规则是否不允许多次循环执行,默认是false;
lock-on-active:lock-on-active true 通过这个标签,可以控制当前的规则只会被执行一次
date-expires:设置规则的过期时间,默认的时间格式:“日-月-年”
date-effective:设置规则的生效时间,时间格式同上。
duration:规则定时,duration 3000,3秒后执行规则
salience:优先级,数值越大越先执行,这个可以控制规则的执行顺序
具体相关属性详情可参考:https://www.jianshu.com/p/697b756b7453