<p>Drools Fusion既是規則引擎,又可以作為CEP。除了<a href="/2013/12/21/event_in_CEP.html" title="事件定義">事件定義</a>和<a href="/2013/12/21/Temporal_of_CEP.html" title="時間推理">時間推理</a>之外,對於引擎本身也會有一些不同的使用。主要體現在會話時鍾、流模式、滑動窗口和對事件的內存管理。</p>
會話時鍾
由於事件的時間性,處理事件時需要一個參考時鍾。
這個參考時鍾在會話配置(KnowledgeSessionConfiguration)中指定,所以稱為會話時鍾(Session Clock)。
有很多種場景需要對時鍾進行控制,比如:
-
規則測試
測試總是需要一個可控的環境,並且當測試包含了帶有時間約束的 規則時,不僅需要控制輸入規則和事實,而且也需要時間流。
-
定期(regular)執行
通常,在運行生產規則時,應用程序需要一個實時時 鍾,允許引擎對時間的行進立即作出反應。
-
特殊環境
特殊環境可以對時間的控制有特殊的要求。群集環境可能需要在心 跳中的時鍾同步,或 JEE 環境可能需要使用一個應用服務器提供的時鍾,等 等。
-
規則重演或模擬
要重演場景或模擬場景也需要應用程序控制時間流。
Drools中默認使用基於系統時鍾的實時時鍾(realtime),也可以使用能被應用程序控制的偽時鍾(pseudo)。設置偽時鍾的方法如下:
1 |
KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); |
流模式
Drools默認運行在雲(Cloud)模式下。雲模式下沒有時間流的概念,引擎知道所有的事實(Fact)和事件(Event)。此時引擎將所有的事實/事件看做是一個無序的雲。
由於雲模式下引擎沒有“現在”的概念,盡管事件具有時間戳、期限等元數據,這些數據也僅僅作為事件的屬性,
不代表事件發生的順序,也不能進行
如果需要處理實時/准實時事件(Event),需要時間推理,Drools必須工作在流(Stream)模式下。
此時要求每個流中的事件必須按照時間順序插入。
啟用流模式
Drools默認運行在雲模式下,可以通過以下方式啟用流模式:
1 |
KnowledgeBaseConfiguration config = |
也可以使用屬性文件定義:drools.eventProcessingMode = stream
。
入口點
Drools定義了工作空間的多個入口點(WorkingMemoryEntryPoint),每個入口點可以看做是一個事件流,可以將事件通過不同的入口點插入到工作空間中。
來自同一個入口點的事件通過時間戳被排序。每個流既可以包含單一類型的事件,也可以包含多種類型的事件。
-
聲明入口點
入口點不需要顯式聲明,在規則中引用的入口點都會在規則編譯期間被自動識別和創建。比如:
1 |
rule "authorize withdraw" |
規則編譯器會識別"ATM Stream"入口點,並在規則庫中創建該入口點。
-
使用入口點
舉例如下:
1 |
// create your rulebase and your session as usual |
除了這種手工插入事實的方式之外,Drools還提供了一系列的管道API和適配器,可以將其他流(如JMS、IO流、Socket等)之間接入到入口點上。
滑動窗口
在流模式中,規則的LHS部分
可以使用滑動窗口限定只關注一定范圍內的事件。這個范圍可以是時間或事件的個數,分別成為滑動時間窗口和滑動長度窗口。
比如:
1 |
StockTick() over window:time( 2m ) |
內存管理
在流模式下,引擎自動執行事件的內存管理。對於不可能再被匹配的事件自動釋放。
引擎會關注事件的@expires中指定的到期時間,並分析規則中隱含的到期時間,進行自動釋放。
原文地址:http://holbrook.github.io/2013/12/22/from_rule_to_cep.html</div>