请注意,此答案对不超过5.x的Drools版本有效。 如果您已升至6或更高,请查看@
melchoir55的修改后答案。我还没有亲自测试过,但是我相信它会起作用。
若要跟踪规则激活,可以使用AgendaEventListener。下面是一个示例,可在此处找到:
https://github.com/gratiartis/sctrcd-payment-validation-
web/blob/master/src/main/java/com/sctrcd/drools/util/TrackingAgendaEventListener.java
您只需要创建这样的侦听器并将其附加到会话即可,如下所示:
ksession = kbase.newStatefulKnowledgeSession();AgendaEventListener agendaEventListener = new TrackingAgendaEventListener();ksession.addEventListener(agendaEventListener);//...ksession.fireAllRules();//...List<Activation> activations = agendaEventListener.getActivationList();
请注意,还有WorkingMemoryEventListener,使您可以跟踪事实的插入,更新和撤回。
跟踪和记录AgendaEventListener的代码:
package com.sctrcd.drools.util;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.drools.definition.rule.Rule;import org.drools.event.rule.DefaultAgendaEventListener;import org.drools.event.rule.AfterActivationFiredEvent;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TrackingAgendaEventListener extends DefaultAgendaEventListener { private static Logger log = LoggerFactory.getLogger(TrackingAgendaEventListener.class); private List<Activation> activationList = new ArrayList<Activation>(); @Override public void afterActivationFired(AfterActivationFiredEvent event) { Rule rule = event.getActivation().getRule(); String ruleName = rule.getName(); Map<String, Object> rulemetaDataMap = rule.getmetaData(); activationList.add(new Activation(ruleName)); StringBuilder sb = new StringBuilder("Rule fired: " + ruleName); if (rulemetaDataMap.size() > 0) { sb.append("n With [" + rulemetaDataMap.size() + "] meta-data:"); for (String key : rulemetaDataMap.keySet()) { sb.append("n key=" + key + ", value=" + rulemetaDataMap.get(key)); } } log.debug(sb.toString()); } public boolean isRuleFired(String ruleName) { for (Activation a : activationList) { if (a.getRuleName().equals(ruleName)) { return true; } } return false; } public void reset() { activationList.clear(); } public final List<Activation> getActivationList() { return activationList; } public String activationsToString() { if (activationList.size() == 0) { return "No activations occurred."; } else { StringBuilder sb = new StringBuilder("Activations: "); for (Activation activation : activationList) { sb.append("n rule: ").append(activation.getRuleName()); } return sb.toString(); } }}


