2014-12-05 181 views
1

我有事件驅動的體系結構。說大約1000個事件類型,每個事件類型可以有多個監聽器。平均每個事件約2個。給2000個處理程序。 對於每個事件處理程序,我都有要進一步評估的規則以查看是否需要該事件處理。Drools規則解僱

handle(MyEvent xxx){ 
kisession.execute(xxx.getPayload()); 
// Here I want the rules that are named/identified againt my Event alone to be fired 
} 

我可以添加MyEvent作爲特定規則的LHS的一部分。

但我希望匹配被預處理以節省處理時間後事件被觸發。 有沒有更好的方法來觸發一個特定的規則而不是讓底層引擎評估所有的2000條規則來找出哪一個適用於有效載荷的事實?

我可以在設計時識別特定事件處理程序的規則,並希望利用此優勢來獲得更好的性能。

+0

AFAIK,潛在的Rete算法應該照顧這一點。它將事實基礎中的對象與規則中的條件相匹配,以便只評估那些可能受某些事實基礎更新影響的規則。 – 2014-12-05 08:58:59

回答

2

如果您選擇從規則引擎外部觸發哪個規則,那麼使用規則引擎絕對沒有意義!

評估哪些規則應該激活是Drools設計的目的。快速。每次撥打fireAllRules時,Drools不需要評估2000條規則,僅僅因爲您有2000條規則。當您創建知識庫時,規則會編譯成圖形,讓引擎確定哪些規則可能觸發某些匹配。每次插入,修改或收回事實時,圖都會更新。這有點像有一個索引數據庫表。

當然,你可以在技術上做到這一點。使用fireAllRules(AgendaFilter)方法來過濾可能觸發的規則。

+1

(完成@Steve的最後一段),,,這很可能會使一切效率下降。 – laune 2014-12-05 12:41:04