復雜事件處理引擎—Esper入門


說明:

  以下內容,可以參考Esper官方網站《Qucik start & Tutorial 》(順序做了部分調整)。 PS:因為英語水平有限(大學期間剛過CET4的英語小盲童一枚),翻譯很爛(自己都感覺不能直視),描述不清的,可以隨時問。一有時間,將給予解釋。

1、什么是Esper?

Esper 是一個事件流處理和事件關聯的引擎(CEP,complex event processing 復合事件處理)。作為實時事件驅動框架,當事件流中有事件條件發生時,Esper能夠觸發自定義動作(POJO)。Esper也是為了大量事件關聯而設計,當有數百萬的事件進來時,用經典的數據庫架構來存儲所有事件就有點力不從心了。

Esper定制的事件處理語言EPL,允許表達豐富的事件條件、關聯性,也可跨越事件窗口,從而最大限度的減少為應對復雜情況而必須建立系統的開發難度。

Esper是輕量級的java內核實現,可以完全嵌入到任何的java進程、javaEE應用服務器或者給予javaESB(企業服務總線)。Esper可以很快完成傳入的大量消息或者事件處理的應用程序的開發工作。

【總結】Esper是一個事件處理和復雜事件關聯處理的java內核的輕量級引擎。對於大量事件的處理,能夠用最短的時間做出反應,觸發相應的操作。另外,為Esper量身定制的事件處理語言——類SQL語言,對於表達事件的條件以及關聯關系的處理等非常方便。

 

2、快速入門

2.1 安裝

Esper的運行和安裝很容易,從官網下載並解壓縮發布的Ziptar文件即可。只要安裝了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> EPAdministratorstatement管理接口,管理引擎實例注冊的EPL statement

4> EPStatement  一個EPL語句。通過EPAdministrator.createEPL這一類的API創建。

5> EPRuntime 運行接口,通過EPServceProvider.getEPRuntime獲取。其作用是向引擎實例發送事件。

其中Configuration中很多配置無需設置,只有在使用plug-in或者關系型數據訪問的時候,必須設置相關參數。

 

注: 轉載請注明出處。謝謝!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM