
Drools 8 不提供公开 API 直接获取 Agenda 中已激活的规则,但可通过内部 RuleImpl 类型转换,遍历 KieBase 中所有规则并提取其 agenda group、名称和所属包等元信息,实现规则清单的程序化检索与展示。
drools 8 不提供公开 api 直接获取 agenda 中已激活的规则,但可通过内部 `ruleimpl` 类型转换,遍历 kiebase 中所有规则并提取其 agenda group、名称和所属包等元信息,实现规则清单的程序化检索与展示。
在 Drools 8 中,Agenda 本身是一个运行时概念,用于管理当前会话(KieSession)中已匹配但尚未执行的 Activation(即规则触发实例),其设计初衷是面向执行而非反射式查询。因此,官方不支持直接从 Agenda 对象中枚举“当前待执行规则”——因为 Agenda 并不持久化规则定义,只维护激活状态;而规则定义(Rule)实际归属于 KieBase 的编译模型中。
不过,若目标是“查看哪些规则可能被激活”(例如用于调试、规则治理或 UI 展示),最可靠的方式是遍历 KieBase 中所有已加载规则,并提取其运行时相关元数据,如 agenda group、activation group、salience 等。虽然 Rule 接口本身未暴露 getAgendaGroup() 方法,但其实现类 org.drools.core.definitions.rule.impl.RuleImpl 提供了该能力。通过安全类型转换(需确保使用的是 Drools 内部构建的规则对象),即可访问这些内部属性。
以下为推荐实现方式:
import org.kie.api.KieBase;
import org.kie.api.definition.rule.Rule;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(RuleRetrievalExample.class);
public void listAllRulesWithAgendaGroup(KieBase kieBase) {
LOG.info("=== Listing all rules with agenda group information ===");
for (KiePackage kp : kieBase.getKiePackages()) {
for (Rule rule : kp.getRules()) {
String agendaGroup = "MAIN"; // default
if (rule instanceof RuleImpl) {
agendaGroup = ((RuleImpl) rule).getAgendaGroup();
if (agendaGroup == null) agendaGroup = "MAIN";
}
LOG.info("Package: '{}' | Rule: '{}' | Agenda Group: '{}'",
kp.getName(),
rule.getName(),
agendaGroup);
}
}
}
✅ 关键说明:
- 此方法列出的是 所有已编译进 KieBase 的规则,而非当前 KieSession 中实际匹配并入 Agenda 的激活规则(后者需监听 AgendaEventListener 或启用 DebugEventListener 跟踪 matchCreated 事件)。
- 强制转换为 RuleImpl 属于内部 API 使用,虽在 Drools 8.x 主流版本中稳定可用,但不保证向后兼容。生产环境建议封装隔离,并添加 instanceof 检查及降级逻辑(如 fallback 到 "MAIN")。
- 若需获取 实时激活规则(即当前 Agenda 中真正 pending 的 Activation),可结合 KieSession.getAgenda().getAgendaGroups() 遍历各 AgendaGroup,再调用 getActivations() 获取 Activation 列表,进而通过 activation.getRule() 反查规则对象——但注意:Activation.getRule() 返回的仍是 Rule 接口,仍需同上转换才能获取 agenda group。
? 总结:
对于规则元信息审计与可视化场景,优先采用 KieBase 遍历 + RuleImpl 类型转换方案;对于运行时动态分析,则应配合事件监听机制。避免依赖未公开的内部字段或反射,以保障升级鲁棒性。










