持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
1、前言
在上一篇的分享中,我为大家介绍了对Drools的一些封装的工具类,本次就结合一个实际案例为大家介绍下Drools的开发流程。
2、地铁计费案例
这里以北京地铁的计费规则为例:6公里(含)内3元;6-12公里(含)4元;12-22公里(含)5元;22-32公里(含)6元;32公里以上每加1元可乘20公里。
2.1、创建Fact对象
Fact对象可以理解为我们传入规则引擎的变量,就是一个普通的可以插入到规则引擎 WorkingMemory 的 JavaBean 。这样规则引擎就可以对 Fact 对象做读写操作。(Fact对象是传入的 Bean 的引用,同时这个 JavaBean 需要具备 setter 与 getter 方法)当 Fact 对象插入到 WorkingMemory 当中后,会与当前 WorkingMemory 当中所有的规则进行匹配,同时返回一个 FactHandler 对象。FactHandler 对象是插入到 WorkingMemory当中 Fact 对象的引用句柄,通过 FactHandler 对象可以实现对 Fact 对象的删除及修改等操作。
//地铁费用
@Data
public class SubwayFare {
private Integer subwayFare;
}
2.2、Service
@Service
public class TaxiFareCalculatorService {
public Integer calculateFare(Integer subwayMileage) {
//组装规则名
String calculateFareRule = RuleUtil.buildRuleName(TEMPLATENAME_calculateFare, null);
//获取kieSession
KieSession kieSession = RuleBuilder.newKieSession(stpcCheckFilterRule);
//校验kieSession
if(kieSession == null){
String msg = MessageFormat.format("未获取到规则会话【{0}】,地铁计费服务加载校验失败,请重新加载规则。", calculateFareRule);
logger.error(msg);
throw new PromptException(msg);
}
//设置全局变量
kieSession.setGlobal("subwayMileage", subwayMileage);
// 执行规则校验
logger.info("地铁计费-->开始执行规则校验!");
SubwayFare subwayFare = new SubwayFare();
RuleUtil.execEval(kieSession, subwayFare);
logger.info("地铁计费-->规则校验执行完毕!");
return subwayFare.getSubwayFare();
}
}
2.3、规则文件
这里我们需要先把规则写好,然后插入数据库中。
//引入全局变量 - 乘坐里程
global java.lang.String subwayMileage;
import com.sf.drools.entity.SubwayFare;
import java.lang.Integer;
//6公里 - 3元
rule "check_6Kilometer"
//规则优先级
salience 100
when
//接收传入的车费变量
$subwayFare:SubwayFare();
eval(subwayMileage <= 6);
then
System.out.println("#公里数 : " + subwayMileage);
System.out.println("#应付车费 : "+3);
subwayFare.setSubwayFare(3);
//跳出当前规则校验、后续规则也无需校验
drools.halt();
end
//6-12公里(含)4元
rule "check_12Kilometer"
salience 99
when
//接收传入的车费变量
$subwayFare:SubwayFare();
eval(subwayMileage >= 6 && subwayMileage <= 12);
then
System.out.println("#公里数 : " + subwayMileage);
System.out.println("#应付车费 : "+4);
subwayFare.setSubwayFare(4);
//跳出当前规则校验、后续规则也无需校验
drools.halt();
end
这里的示例还是比较简单的,我就写了两个规则,其他的俄式如此。同时可以看到封装了统一的工具类后,代码也变得简洁了许多。
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊