Drools-如何找出所有匹配的规则?

我有一个.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();

}

}

}

以上是 Drools-如何找出所有匹配的规则? 的全部内容, 来源链接: utcz.com/qa/420945.html

回到顶部