在Java代码中访问drool规则详细信息

时间:2013-04-12 12:04:45

标签: java drools rule-engine

我是Drools规则引擎的新手。

我创建了一个规则文件,即 .drl 文件。在该文件中,我定义了三个规则,并使用突出性属性为每个规则分配了优先级。

一旦执行了规则,我想知道已执行的规则的详细信息,例如规则名称,显着性值。另外,我想要执行规则的顺序。

有人可以帮帮我吗?

1 个答案:

答案 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());
    }
});

每个被解雇的规则都会触发该事件 请注意,这可能在将来的版本中不起作用,因为我假设ActivationAgendaItem对象。我这样做是为了获得显着性(需要访问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