說明:
以下內容,可以參考Esper官方網站《Qucik start & Tutorial 》(順序做了部分調整)。 PS:因為英語水平有限(大學期間剛過CET4的英語小盲童一枚),翻譯很爛(自己都感覺不能直視),描述不清的,可以隨時問。一有時間,將給予解釋。
1、什么是Esper?
Esper 是一個事件流處理和事件關聯的引擎(CEP,complex event processing 復合事件處理)。作為實時事件驅動框架,當事件流中有事件條件發生時,Esper能夠觸發自定義動作(POJO)。Esper也是為了大量事件關聯而設計,當有數百萬的事件進來時,用經典的數據庫架構來存儲所有事件就有點力不從心了。
Esper定制的事件處理語言EPL,允許表達豐富的事件條件、關聯性,也可跨越事件窗口,從而最大限度的減少為應對復雜情況而必須建立系統的開發難度。
Esper是輕量級的java內核實現,可以完全嵌入到任何的java進程、javaEE應用服務器或者給予java的ESB(企業服務總線)。Esper可以很快完成傳入的大量消息或者事件處理的應用程序的開發工作。
【總結】Esper是一個事件處理和復雜事件關聯處理的java內核的輕量級引擎。對於大量事件的處理,能夠用最短的時間做出反應,觸發相應的操作。另外,為Esper量身定制的事件處理語言——類SQL語言,對於表達事件的條件以及關聯關系的處理等非常方便。
2、快速入門
2.1 安裝
Esper的運行和安裝很容易,從官網下載並解壓縮發布的Zip或tar文件即可。只要安裝了JVM,便可以運行官網發布的sample。
Esper的核心包是“esper-version.jar”,其運行依賴的jar包,在解壓縮后的lib文件夾。
2.2 創建java事件類
Java類是事件表示的不錯選擇,然而,根據架構需求,也可以選擇基於Map或者XML的事件表示。
Order事件的java類表示。一個POJO,如下:
package org.myapp.event; public class OrderEvent { private String itemName; private double price; public OrderEvent(String itemName, double price) { this.itemName = itemName; this.price = price; } public String getItemName() { return itemName; } public double getPrice() { return price; } }
2.2 創建Statement
Statement是一個連續性的查詢,通過引擎實例進行注冊,當新數據到達時,實時地向監聽提供結果,或通過iteratorAPI獲取statement執行結果。
下面的代碼段獲取了一個引擎實例,並注冊了一個持續查詢。該查詢返回在過去30秒的所有OrderEvent事件的平均價格:
EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); //獲取默認的引擎實例 String expression = "select avg(price) from org.myapp.event.OrderEvent.win:time(30 sec)"; EPStatement statement = epService.getEPAdministrator().createEPL(expression); //注冊EPL,獲取statement
2.3 添加監聽
當statement的結果集發生變化時,引擎會調用監聽作為一個或者多個事件的響應。監聽類需要實現UpdateListener接口,並在EventBean實例上執行操作:
public class MyListener implements UpdateListener { public void update(EventBean[] newEvents, EventBean[] oldEvents) { EventBean event = newEvents[0]; System.out.println("avg=" + event.get("avg(price)")); } }
通過對statement添加監聽,引擎實例會將statement的運行結果提供給監聽程序。添加操作如下:
MyListener listener = new MyListener(); statement.addListener(listener);
2.4 發送事件
運行時(EPRuntime)API接受事件處理。當statement的結果發生改變,引擎會將處理過的事件結果發送給監聽。
OrderEvent event = new OrderEvent("shirt", 74.50); epService.getEPRuntime().sendEvent(event);
2.5 配置(Configuration)
Esper是開箱運行的,基本沒有必須需要的配置。除了需要增加statement的可讀性,或提供插件擴展和配置關系型數據訪問的機會時必需。
一個有用的配置項,指定了采用事件類的java包名。下面是為OrderEvent添加包的聲明。
Configuration config = new Configuration(); config.addEventTypeAutoAlias("org.myapp.event"); //該API雜4.9.0中已經取消,可以使用addEventTypeAutoName EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config);
添加了包的聲明之后,就可以在EPL中移除事件類對應的包名。
String epl = "select avg(price) from OrderEvent.win:time(30 sec)";
EPStatement statement = epService.getEPAdministrator().createEPL(epl);
【總結】
開發一個簡單的Esper程序,需要了解如下的API:
1> Configuration 引擎配置API,可以配置關系型數據訪問的一些必須參數、Virtual Data Window (虛擬數據窗)、插件等。
2> EPServiceProvider,定義Esper服務提供,也就是Esper引擎。通過EPServiceProvierManager.getDefaultProvder()獲取默認的引擎實例。
3> EPAdministrator,statement管理接口,管理引擎實例注冊的EPL statement。
4> EPStatement 一個EPL語句。通過EPAdministrator.createEPL這一類的API創建。
5> EPRuntime 運行接口,通過EPServceProvider.getEPRuntime獲取。其作用是向引擎實例發送事件。
其中Configuration中很多配置無需設置,只有在使用plug-in或者關系型數據訪問的時候,必須設置相關參數。
注: 轉載請注明出處。謝謝!!