0

私は Drools ルール エンジンの初心者です。

単一のルール ファイル、つまり.drlファイルを作成しました。そのファイルでは、3 つのルールを定義し、salience属性を使用してそれぞれに優先順位を割り当てました。

ルールが実行されたら、ルール名、顕著値など、実行されたルールの詳細を知りたいです。また、ルールが実行された順序が必要です。

誰か助けてくれませんか?

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

イベントは、発生するすべてのルールに対して発生します。はオブジェクトである
と想定しているため、将来のバージョンでは機能しない可能性があることに注意してください。これは、salience にアクセスするためです (インターフェイスではなくクラスにアクセスする必要があります)。ActivationAgendaItemRuleRule

何をいつログに記録するかを完全に制御できる別の方法として、追跡ファクトを登録し、次のように追跡メソッドを手動で呼び出すことができます。

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 に答える