2013-01-17 124 views
2

(我對使用Drools有點新,所以請原諒,如果這是一個簡單的問題)。使用Drools執行反應規則

我想使用Drools來反應性執行規則,這意味着我們可以將「事實」插入爲「事件」實例。不過,我希望這樣執行的方式可以在收到事件後立即觸發規則。但是,如果規則可能取決於多個事件,我如何配置工作記憶以記住以前的事件。考慮一個很簡單的例子:

說我有以下規則:

- when (E1) do A1 
- when (E2) do A2 
- when (E1,E2) do A3 

然後,如果時間的推移如下,我想下面的規則將被解僱,例如:

- t=1 , E1 happens => A1 fired 
- t=2 , E2 happens => A2 fired + A3 fired 

我遇到的問題是,如果每次插入後都撥打ksession.fireAllRules(),工作記憶將會忘記以前的所有事件。什麼是最好的方式來實現我想要的?

回答

0

只要您使用Stateful Knowledge Session,什麼你可能做,因爲無國籍人有沒有fireAllRules()方法時,WM將忘記所有插入的事實。

你表達爲「E1發生」應該是ksession.insert(E1);

你可以玩文中給出的例子(上面的鏈接)...

+0

感謝pgras,我已經修復了我的代碼。儘管我現在想了解,規則引擎如何知道不重新激發它已經匹配的規則?由於事實依然存在於WM中。如果這種情況在任何文檔中都有解釋,將有助於閱讀... – Larry

+0

是的,這在文檔中有解釋。規則由一組事實激活,當插入一組符合規則條件的事實時,創建並激活激活(在fireAllRules()上)。之後,如果您修改了其中一個事實並通知引擎(ksession.modify/update),則會重新創建激活,並且可以重新啓動規則。如果你沒有改變你的事實,這個規則將被激活並且僅僅爲了這些事實而被解僱一次。 – salaboy