我是Drools规则引擎的新手。
我创建了一个规则文件,即 .drl 文件。在该文件中,我定义了三个规则,并使用突出性属性为每个规则分配了优先级。
一旦执行了规则,我想知道已执行的规则的详细信息,例如规则名称,显着性值。另外,我想要执行规则的顺序。
有人可以帮帮我吗?
答案 0 :(得分:1)
您可以使用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