Drools规则配置:如何为单个规则设置多个agenda-group实现复用
Drools 单规则绑定多分组实现方案
Drools 原生的 agenda-group 属性不支持直接配置多个分组值,你可以通过以下几种方案实现规则多分组共享的需求:
方案1:规则继承复用(推荐,无侵入)
把公共规则逻辑抽成抽象父规则,不同分组的子规则继承父规则即可实现逻辑复用,同时绑定不同的agenda-group,完全符合Drools原生语法规范:
// 抽离公共逻辑作为抽象父规则 rule "PromotionGlobalTest_Parent" enabled true salience 0 dialect "mvel" when c : Contract( serviceType not in ( 2, 3 ) ) then c.createMessage( "2, 3" ); end // 绑定global分组的子规则 rule "Row 1 PromotionGlobalTest_Global" extends "PromotionGlobalTest_Parent" agenda-group "global" end // 绑定group1分组的子规则 rule "Row 1 PromotionGlobalTest_Group1" extends "PromotionGlobalTest_Parent" agenda-group "group1" end
方案2:自定义元标签+规则过滤器
给规则加自定义元数据存储多个分组标识,执行规则时通过自定义过滤器匹配标签即可,不需要拆分规则,灵活度更高:
rule "Row 1 PromotionGlobalTest" enabled true salience 0 dialect "mvel" // 用元数据存储多个分组标识 metadata @tags("global", "group1") when c : Contract( serviceType not in ( 2, 3 ) ) then c.createMessage( "2, 3" ); end
Java 侧执行规则时传入要激活的分组,自定义过滤器匹配规则:
String targetGroup = "group1"; ksession.fireAllRules(new RuleFilter() { @Override public boolean accept(Rule rule) { String[] tags = (String[]) rule.getMetaData().get("tags"); if (tags == null) return false; // 匹配到对应分组就放行执行 return Arrays.asList(tags).contains(targetGroup); } });
方案3:公共分组批量激活
固定一个全局公共分组global,所有需要多分组共享的规则都绑定该分组,每次执行业务分组前,先把公共分组加入激活队列:
// 执行group1分组时,同时激活global公共分组 Agenda agenda = ksession.getAgenda(); agenda.getAgendaGroup("global").setFocus(); agenda.getAgendaGroup("group1").setFocus(); ksession.fireAllRules();
该方案适合有大量全局公共规则、分组逻辑分层清晰的场景。
内容的提问来源于stack exchange,提问作者Vanessa Nadal
相关产品推荐
相关产品推荐

