Drools决策表需求:每张规则表匹配首个规则后退出的解决方案
解决Drools决策表单表首规则匹配后退出且跨表依赖更新值的问题
问题根源
kieSession.fireAllRules(1)是全局限制仅执行1条规则,不管规则属于哪张表,所以只会触发第一张表的首个匹配规则,第二张表的规则完全没有执行机会。要实现每张表各自执行首个匹配规则,且第二张表使用第一张表更新后的字段值,需要分阶段控制规则执行流程。
可靠解决方案
方案1:拆分KieSession分阶段执行(推荐)
将两张Excel规则表分别绑定到独立的KieSession,先执行第一张表的规则完成字段更新,再将更新后的对象传入第二张表的KieSession执行其首个规则。这种方式逻辑清晰,避免全局状态干扰。
- 配置kmodule.xml
为两张规则表分别定义独立的KieBase和KieSession,指定对应Excel文件:
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="firstTableKbase" packages="rules.first"> <ksession name="firstTableSession"/> </kbase> <kbase name="secondTableKbase" packages="rules.second"> <ksession name="secondTableSession"/> </kbase> </kmodule>
(注:需将两张Excel规则表分别放置在rules/first和rules/second目录下)
- 代码实现
// 执行第一张规则表,更新对象字段 KieSession firstSession = kieContainer.newKieSession("firstTableSession"); firstSession.insert(yourBusinessObject); firstSession.fireAllRules(1); // 仅执行第一张表的首个匹配规则 firstSession.dispose(); // 执行第二张规则表,使用更新后的字段值 KieSession secondSession = kieContainer.newKieSession("secondTableSession"); secondSession.insert(yourBusinessObject); // 传入已更新的对象 secondSession.fireAllRules(1); // 仅执行第二张表的首个匹配规则 secondSession.dispose();
方案2:单Session内通过标志+议程组控制
如果不想拆分Session,可以通过全局标志控制单表规则执行次数,配合议程组保证执行顺序。
- 定义全局标志与议程组
在规则执行代码中设置全局原子布尔变量,标记每张表是否已执行首个规则:
KieSession session = kieContainer.newKieSession(); // 用原子类保证线程安全 session.setGlobal("firstTableExecuted", new AtomicBoolean(false)); session.setGlobal("secondTableExecuted", new AtomicBoolean(false)); session.insert(yourBusinessObject); // 强制先执行第一张表的议程组 session.getAgenda().getAgendaGroup("firstTableGroup").setFocus(); session.fireAllRules(); // 再执行第二张表的议程组 session.getAgenda().getAgendaGroup("secondTableGroup").setFocus(); session.fireAllRules(); session.dispose();
- 规则表配置
- 为第一张表的所有规则添加前置条件:
$flag : firstTableExecuted+$flag.get() == false,动作中设置$flag.set(true)标记已执行。 - 为第二张表的所有规则添加前置条件:
$flag : secondTableExecuted+$flag.get() == false,动作中设置$flag.set(true)。 - 在Excel规则表的"Agenda Group"列分别填写
firstTableGroup和secondTableGroup,绑定到对应议程组。
内容的提问来源于stack exchange,提问作者fuat
相关产品推荐
相关产品推荐

