You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drools7.x SpringBoot项目循环触发规则仅首条匹配规则生效问题咨询

问题原因

核心原因是Drools中AgendaGroup的焦点仅在单次fireAllRules()执行期间有效:
你仅在创建KieSession后调用了一次setFocus(),第一次循环执行fireAllRules()时,test分组处于焦点态,匹配到name=0的规则正常触发;执行完fireAllRules()后,Agenda的栈结构会自动弹出当前处于焦点的分组,第二次循环触发规则时,test分组已无焦点,该分组下的所有规则都不会被调度匹配,因此name=1的规则2未触发。

解决方案

可任选以下一种方案修复:

  • 把setFocus()调用移到循环内部,每次执行fireAllRules()前重新设置焦点:
public void test() {
        KieSession kSession = kieContainer.newKieSession();
        for (int i=0;i<2;i++) {
            Model c = new Model();
            c.setName(String.valueOf(i));
            kSession.insert(c);
            // 每次触发规则前重设agenda组焦点
            kSession.getAgenda().getAgendaGroup("test").setFocus();
            kSession.fireAllRules();
        }
        kSession.dispose();
        return null;
    }
  • 在drl规则文件中给agenda-group添加auto-focus true属性,无需手动调用setFocus:
package rule;
import com.my.b.Model;
agenda-group "test" auto-focus true;
// 其余规则内容保持不变
  • 如果你的业务不需要对规则做分组调度,直接删除drl中的agenda-group "test"配置,同时删掉业务代码中的setFocus调用即可。

内容的提问来源于stack exchange,提问作者frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:54:04