Drools开发示例

372 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 

这里的示例还是比较简单的,我就写了两个规则,其他的俄式如此。同时可以看到封装了统一的工具类后,代码也变得简洁了许多。

好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊