前提:环境搭建,参考博文
springboot整合drools规则引擎 示例入门-CSDN博客
案例1,商城系统消费赠送积分
100元以下, 不加分
100元-500元 加100分
500元-1000元 加500分
1000元 以上 加1000分
订单pojo编写
package cn.beijing.model;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@Data
@Accessors(chain = true)
public class Order {
/**
* 订单原价金额
*/
private int amout;
/**
*下单人
*/
private String user;
/**
*积分
*/
private int score;
/**
* 下单日期
*/
private Date bookingDate;
}
规则drl文件编写
package rules
import cn.beijing.model.Order
rule "zero"
no-loop true //防止陷入死循环
lock-on-active true //用于确保规则仅执行一次,防止因其他规则触发导致的重复执行
salience 1 //指定优先级,数值越大优先级越高,不指定的情况下由上到下执行
when
$s : Order(amout <= 100)
then
$s.setScore(0);
// update($s);
end
rule "add100"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 100 && amout <= 500)
then
$s.setScore(100);
// update($s);
end
rule "add500"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 500 && amout <= 1000)
then
$s.setScore(500);
// update($s);
end
rule "add1000"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 1000)
then
$s.setScore(1000);
// update($s);
end
案例2,规则里比较等操作符使用
pojo文件
package cn.beijing.model;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class ComparisonEntity {
/**
*名字集合
*/
private String names;
/**
* 字符串集合
*/
private List<String> list;
}
规则drl文件
package rules
import cn.beijing.model.ComparisonEntity
/*
用于测试Drools提供的比较操作符
*/
//测试比较操作符contains
rule "rule_comparison_contains"
when
ComparisonEntity(names contains "张三")
ComparisonEntity(list contains names)
then
System.err.println("规则rule_comparison_contains触发-----包括张三");
end
//测试比较操作符not contains
rule "rule_comparison_notContains"
when
ComparisonEntity(names not contains "张三")
ComparisonEntity(list not contains names)
then
System.err.println("规则rule_comparison_notContains触发----不包括张三");
end
//测试比较操作符memberOf
rule "rule_comparison_memberOf"
when
ComparisonEntity(names memberOf list)
then
System.err.println("规则rule_comparison_memberOf触发-----name在list里");
end
//测试比较操作符not memberOf
rule "rule_comparison_notMemberOf"
when
ComparisonEntity(names not memberOf list)
then
System.err.println("规则rule_comparison_notMemberOf触发-------name不在list里");
end
//测试比较操作符matches
rule "rule_comparison_matches"
when
ComparisonEntity(names matches "张.*")
then
System.err.println("规则rule_comparison_matches触发------name匹配张.*");
end
//测试比较操作符not matches
rule "rule_comparison_notMatches"
when
ComparisonEntity(names not matches "张.*")
then
System.err.println("规则rule_comparison_notMatches触发------name--不----匹配张.*");
end
案例3,global全局变量使用
pojo文件
package cn.beijing.model;
import lombok.Data;
// 业务模型类
@Data
public class OrderRequest {
private Integer amount;
}
//------------------------------------
package cn.beijing.model;
import lombok.Data;
// 订单折扣类
@Data
public class OrderDiscount {
private Integer discount = 0;
}
规则drl文件
package rules
import cn.beijing.model.OrderRequest;
global cn.beijing.model.OrderDiscount orderDiscount;
rule "规则111111111111111"
when
$order: OrderRequest(amount < 20 || amount > 50)
then
orderDiscount.setDiscount(orderDiscount.getDiscount() + 10);
System.err.println("orderDiscount.toString() = " + orderDiscount.toString());
System.err.println("触发规则:" + drools.getRule().getName());
end
调用代码
@RequestMapping("global_test_1")
public Object quyu_jianche_global_test_1(OrderRequest orderRequest)
{
KieSession kieSession = kieContainer.newKieSession("ksession");
OrderDiscount orderDiscount = new OrderDiscount();
//设置全局变量
kieSession.setGlobal("orderDiscount", orderDiscount);
try {
kieSession.insert(orderRequest);
kieSession.fireAllRules();
} finally {
kieSession.dispose();
}
return orderDiscount;
}
部分代码,参考博文
Drools基本介绍,入门案例,基本语法-CSDN博客