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

如何在Drools的StatelessKieSession中设置AgendaGroup焦点?

在StatelessKieSession中设置AgendaGroup焦点的方案

好问题!确实,StatelessKieSession不像有状态的KieSession那样直接提供getAgenda().getAgendaGroup().setFocus()这类API,但我们有两种可靠的方式来实现这个需求:

方法一:使用Command API(推荐)

StatelessKieSession的核心执行逻辑是通过execute()方法处理Command对象,我们可以利用SetAgendaGroupCommand在执行规则前主动设置目标AgendaGroup的焦点。具体代码示例如下:

KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());

// 创建无状态会话
StatelessKieSession statelessSession = kContainer.newStatelessKieSession();

// 构建命令批处理:先设置AgendaGroup焦点,再插入业务对象
List<Command> commandList = new ArrayList<>();
// 第二个参数传true,表示给该AgendaGroup设置焦点
commandList.add(CommandFactory.newSetAgendaGroup("us", true));
commandList.add(CommandFactory.newInsert(yourBusinessFact)); // 替换成你的实际业务对象

// 执行批处理命令
statelessSession.execute(CommandFactory.newBatchExecution(commandList));

这种方式的优势是灵活可控,你可以针对不同的执行场景设置不同的AgendaGroup焦点,完全适配无状态会话的一次性执行特性。

方法二:在规则文件中设置自动焦点

如果你的业务场景中,某个AgendaGroup的规则总是需要优先执行,也可以直接在规则文件里给AgendaGroup添加auto-focus属性:

// 给"us"这个AgendaGroup设置自动焦点
agenda-group "us" auto-focus true

rule "ExampleRule"
    agenda-group "us"
    when
        // 规则匹配条件
        Fact(condition == true)
    then
        // 规则执行动作
        System.out.println("Executing rule in 'us' agenda group");
end

不过要注意,这个设置是全局生效的——只要会话启动,带有auto-focus的AgendaGroup就会自动获得焦点,适合那些固定优先级的规则场景。

额外提示

因为StatelessKieSession是无状态的,每次调用execute()都会创建一个全新的会话实例,所以每次执行都需要重新设置焦点(不管用哪种方法),之前的设置不会被保留哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:52:28