Drools 7.69.0决策表无匹配条件时如何设置默认值
Drools 7.69.0决策表无命中时默认值与默认动作配置方法
针对基于Drools 7.69.0做决策表开发、无规则命中时走默认逻辑的需求,有三种可直接落地的实现方案:
方案1:决策表内置最低优先级兜底规则(最简便)
直接在决策表所有业务规则的最后一行追加兜底规则,配置要点如下:
- 在规则属性列找到
salience(规则优先级)配置项,给该行设置全局最低值,比如-1000,保证所有业务规则完成匹配判断后才会执行这条规则 - 所有条件列全部留空,不填写任何判断表达式,代表可匹配所有传入的事实对象
- 动作列直接编写默认赋值、默认执行的逻辑即可
- 额外给该行规则配置
no-loop true属性,避免规则重复触发
给出的三段或条件逻辑,拆分决策表业务规则时直接拆为3行独立规则即可,无需做复杂嵌套:
- 第一行条件配置:
statusRequest.useCase in ("usecase1", "usecase2", "usecase3", "usecase4"),对应第一组集合包含判断- 第二行条件配置:
statusRequest.useCase == "usecase6", statusRequest.aspect == $param,参数列传入需要匹配的aspect值,对应第二组与逻辑- 第三行条件配置:
statusRequest.useCase != "usecase5", statusRequest.correction == true,对应第三组与逻辑
方案2:配合命中标记做严格兜底(最稳妥)
如果担心空条件兜底因执行顺序问题误触发,可以加命中标记做严格判断:
- 先定义一个简单的命中标记事实类
RuleHitFlag,内置boolean类型的hit属性,初始值为false - 所有业务规则的动作列第一行,统一加上
flag.setHit(true); update(flag);逻辑,只要任意业务规则命中,就把标记改为已命中状态 - 最后追加的兜底规则,条件列明确写
RuleHitFlag(hit == false),只有所有业务规则都没命中时才会触发,动作列写默认逻辑即可
方案3:代码层统计命中数走默认逻辑(无侵入)
如果不想修改已有决策表结构,可以直接在Java调用层做判断:
- 给Drools会话添加
AgendaEventListener监听器,统计业务规则的实际命中数量 - 调用
fireAllRules()执行完所有规则后,如果统计到的命中数为0,直接在Java代码中执行默认赋值、默认动作逻辑 - 核心实现代码参考:
StatefulKnowledgeSession session = kieBase.newStatefulKnowledgeSession(); AtomicInteger bizRuleHitCount = new AtomicInteger(0); session.addEventListener(new DefaultAgendaEventListener() { @Override public void afterMatchFired(AfterMatchFiredEvent event) { // 排除兜底规则本身,只统计业务规则命中数 if (!event.getMatch().getRule().getName().startsWith("GLOBAL_DEFAULT_RULE")) { bizRuleHitCount.incrementAndGet(); } } }); session.insert(statusRequest); session.fireAllRules(); if (bizRuleHitCount.get() == 0) { // 执行默认逻辑 applyDefaultResult(statusRequest); }
内容的提问来源于stack exchange,提问作者fuat
相关产品推荐
相关产品推荐

