2013-04-12 32 views
0

我是Drools規則引擎的新手。在Java代碼中訪問流口水規則的細節

我創建了一個規則文件,即.drl文件。在該文件中,我已經定義了三條規則,並且分別使用顯着性屬性分配了優先級。

規則一旦執行完畢,我想知道已執行的規則的細節,如規則名稱,顯着性值。另外,我想要執行規則的順序。

有人可以幫我嗎?

回答

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