我是 Drools 规则引擎的新手。
我创建了一个规则文件,即.drl文件。在该文件中,我定义了三个规则,并使用显着属性为每个规则分配了优先级。
规则执行后,我想知道已执行规则的详细信息,例如规则名称、显着性值。另外,我想要执行规则的顺序。
有人可以帮帮我吗?
我是 Drools 规则引擎的新手。
我创建了一个规则文件,即.drl文件。在该文件中,我定义了三个规则,并使用显着属性为每个规则分配了优先级。
规则执行后,我想知道已执行规则的详细信息,例如规则名称、显着性值。另外,我想要执行规则的顺序。
有人可以帮帮我吗?
您可以为此使用 AgendaEventListener:
import org.drools.event.rule.AfterActivationFiredEvent;
import org.drools.event.rule.DefaultAgendaEventListener;
...
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
ksession.addEventListener(new DefaultAgendaEventListener() {
@Override
public void afterActivationFired(AfterActivationFiredEvent event) {
AgendaItem item = (AgendaItem) event.getActivation();
System.out.println("Name: " + item.getRule().getName() + "; Salience: " + item.getRule().getSalience());
}
});
该事件将针对每个被触发的规则触发。
小心,这在未来的版本中可能不起作用,因为我假设Activation
是一个AgendaItem
对象。我这样做是为了获得显着性(需要访问Rule
类而不是Rule
接口)。
作为替代方案,您可以完全控制何时记录什么,您可以注册一个跟踪事实并手动调用跟踪方法,如下所示:
import org.drools.rule.Rule;
public class RulesTracking {
private List<String> tracking = new ArrayList<String>();
public void track(Rule rule) {
tracking.add("Name: " + rule.getName() + "; Salience: " + rule.getSalience());
}
public List<String> getTracking() {
return tracking;
}
}
然后在设置会话的类中,创建跟踪对象并将其注册为“事实”,在所有处理完成后,您可以输出跟踪结果:
...
rulesTracking = new RulesTracking(); // register this as a "fact"
// more stuff, fireAllRules
System.out.println(rulesTracking.getTracking());
...
最后,您可以在需要的地方调用跟踪方法,这是一个测试规则:
// test rule that fires for every product
rule "TestRule"
salience 100
when
$product : Product()
$rulesTracking : RulesTracking()
then
$rulesTracking.track(drools.getRule()); // here you call your tracking method manually, absolute control
end