Drools中fireAllRules会触发什么事件?需用EventListener实现耗时监控
Drools 7.73.0.Final 基于EventListener实现fireAllRules()耗时监控
Drools的AgendaEventListener机制正好能满足你的需求——它提供了与fireAllRules()执行生命周期绑定的事件,无需重复编写计时代码,直接通过监听事件完成耗时统计。以下是具体实现方案:
1. 自定义耗时监控监听器
继承DefaultAgendaEventListener(该类默认实现了AgendaEventListener的所有空方法,只需重写需要的事件处理逻辑),利用BeforeFireAllRulesEvent和AfterFireAllRulesEvent作为计时的起止节点:
import org.kie.api.event.rule.DefaultAgendaEventListener; import org.kie.api.event.rule.BeforeFireAllRulesEvent; import org.kie.api.event.rule.AfterFireAllRulesEvent; public class RuleTimerListener extends DefaultAgendaEventListener { private long startTime; @Override public void beforeFireAllRules(BeforeFireAllRulesEvent event) { // 记录fireAllRules()开始执行的时间戳 startTime = System.nanoTime(); // 可选:添加上下文信息,比如会话ID、规则集标识 System.out.println("fireAllRules()启动,会话ID:" + event.getKieRuntime().getIdentifier()); } @Override public void afterFireAllRules(AfterFireAllRulesEvent event) { // 计算耗时并输出/上报 long durationMs = (System.nanoTime() - startTime) / 1_000_000; int firedRuleCount = event.getNumberOfRulesFired(); System.out.printf("fireAllRules()执行完成,耗时:%dms,触发规则数:%d%n", durationMs, firedRuleCount); // 这里可以替换为日志框架打印、监控系统上报等逻辑 } }
2. 注册监听器到KieSession
每次创建KieSession后,将自定义监听器绑定到会话上,后续所有fireAllRules()调用都会自动触发计时逻辑:
KieContainer kieContainer = KieServices.Factory.get().getKieClasspathContainer(); KieSession kieSession = kieContainer.newKieSession(); // 注册耗时监控监听器 kieSession.addEventListener(new RuleTimerListener()); // 执行规则 kieSession.fireAllRules(); // 关闭会话 kieSession.dispose();
关键注意事项
- 计时精度:如果需要微秒级精度,保留
System.nanoTime()即可;毫秒级需求可以改用System.currentTimeMillis() - 会话级别:监听器是绑定到单个KieSession的,复用会话时只需注册一次;每次新建会话都需要重新注册
- 扩展能力:可以在监听器中添加业务上下文信息(比如当前处理的业务ID),方便后续定位性能瓶颈
内容的提问来源于stack exchange,提问作者Trance233
相关产品推荐
相关产品推荐

