0
我是Drools規則引擎的新手。在Java代碼中訪問流口水規則的細節
我創建了一個規則文件,即.drl文件。在該文件中,我已經定義了三條規則,並且分別使用顯着性屬性分配了優先級。
規則一旦執行完畢,我想知道已執行的規則的細節,如規則名稱,顯着性值。另外,我想要執行規則的順序。
有人可以幫我嗎?
我是Drools規則引擎的新手。在Java代碼中訪問流口水規則的細節
我創建了一個規則文件,即.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