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
相关产品推荐
相关产品推荐

