我有一个.DRL文件,其中有10条规则。插入事实后,可能会匹配一些规则-如何找出以编程方式匹配的规则?
请注意,此答案对不超过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; /** * A listener that will track all rule firings in a session. * * @author Stephen Masters */ 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(); } } }