2013-01-10 32 views
2

Drools的決策表文件(link)指出,它是可以選擇的決策表的第一個匹配行:drools決策表 - 如何參加第一場比賽?

由於每一行是一個規則,同樣的原則也適用。由於規則引擎處理事實,所有匹配的規則可能會觸發。 (有些人對此感到困惑,當規則觸發並模擬一個非常簡單的決策表時,可以清除議程,其中只有第一個匹配會影響動作)。

這是如何完成的?我已經設置了Sequential=true,但我不確定還需要做什麼。

回答

2

Drools通過在決策表規則集中定義激活組提供了一種解決此問題的方法(僅選擇第一個匹配的行)。

只有當您想將drools決策表用作查找表時,您的解決方法maxrules = 1纔有效。在這種情況下,因爲只有一個規則可以被觸發,所以使用drools比使用經典的數據庫查找表沒有優勢,這隻會增加複雜性。

如果您決定使用drools或一般的規則引擎,您應該將您的「規則」或「決策」移到規則定義中,以從其優點中獲益最多(RETE引擎,靈活性,規則分離應用程序代碼等)

0

一個FireAllRulesCommand需要被添加的批處理執行與設置爲1,最大規則的一部分:

StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession(); 

    Transaction tx = new Transaction(); 
    tx.setSenderBin("12345"); 

    List<Command<?>> commands = new ArrayList<Command<?>>();  
    commands.add(CommandFactory.newInsert(tx)); 
    commands.add(new FireAllRulesCommand(1)); 

    ExecutionResults results = ksession.execute(
     CommandFactory.newBatchExecution(commands)); 

- 編輯:請參閱接受的答案這樣做的首選方式。

+1

這不是正確的方法,您應該爲您的決策表定義一個激活組。 –

+0

@alikox - 感謝您的信息。你可以給我激活組的理由嗎? –