0

我是 Drools 规则引擎的新手。

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

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

有人可以帮帮我吗?

4

1 回答 1

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
于 2013-04-12T15:41:10.580 回答