復雜事件處理——Esper入門(示例程序)


前面對Esper Quick Start & Tutorial進行了簡單描述,希望各位看官能夠大致了解what is Esper,甚至對how to work有朦朦朧朧的了解。

開發一個Esper事件處理程序,非常簡單。開發之前只需要引入 esper-version.jar即可。

下面是一個簡單的Esper示例,包括一個事件類(POJO)和一個主運行類。事件類如下:

public class MyEvent {
    
    private int id;
    private String name;
    
    public MyEvent(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
}

主運行類如下:

import com.espertech.esper.client.Configuration;
import com.espertech.esper.client.EPAdministrator;
import com.espertech.esper.client.EPRuntime;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;

public class HelloEsper {

    public static void main(String[] args) {
        
        /* 設置配置信息 */
        Configuration config = new Configuration();
        config.addEventType("myEvent", MyEvent.class); //添加事件類型定義
        
        /* 創建引擎實例 */
        EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider(config);
        
        /* 創建statement的管理接口實例 */
        EPAdministrator admin = provider.getEPAdministrator();
        //admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");
        EPStatement statement = admin.createEPL("select id, name from myEvent"); //創建EPL查詢語句實例,功能:查詢所有進入的myEvent事件
        statement.addListener(new UpdateListener() { //為statement實例添加監聽
            @Override
            public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                for(EventBean eb : newEvents) {
                    System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
                }
            }
        });
        
        /* 引擎實例運行接口,負責為引擎實例接收數據並發送給引擎處理 */
        EPRuntime er = provider.getEPRuntime();
        er.sendEvent(new MyEvent(1,"aaa"));  //發送事件
    }

}

其中,事件類,各個屬性必需包括getter-method。getter-method的寫法必需符合JAVA BEAN約定規則。如下:

 

主運行類,也就是Esper處理程序的開發步驟基本如下:

1> 創建Configuraiton實例,配置事件類型、plug-in擴展、關系型數據庫的訪問參數等。

2> 創建引擎實例EPServiceProvider,可通過加載Configuration獲取指定配置的引擎實例;獲取引擎實例時,也可以指定引擎實例名——engineURI。可以參考API。

3> 創建EPAdministrator,用於注冊EPL,獲取EPStatement實例。

4> 為EPStatement添加監聽或者subscriber,獲取引擎處理數據。(在后續的更新中,會比較3種取值方式:監聽、subscriber和pull API)

5> 獲取引擎運行接口EPRuntime。發送事件。

 

上面的Esper運行主類中,使用到了configuration。在前兩篇中有介紹,Configuration一般不是必須的。所以可以通過如下改造,省去Configuration這一步:

public class HelloEsper {

    public static void main(String[] args) {
//        
//        /* 設置配置信息 */
//        Configuration config = new Configuration();
//        config.addEventType("myEvent", MyEvent.class); //添加事件類型定義
        
        /* 創建引擎實例 */
        EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider();
        
        /* 創建statement的管理接口實例 */
        EPAdministrator admin = provider.getEPAdministrator();
        admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");//通過create schema語法注冊 myEvent事件。
        EPStatement statement = admin.createEPL("select id, name from myEvent"); //創建EPL查詢語句實例,功能:查詢所有進入的myEvent事件
        statement.addListener(new UpdateListener() { //為statement實例添加監聽
            @Override
            public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                for(EventBean eb : newEvents) {
                    System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
                }
            }
        });
        
        /* 引擎實例運行接口,負責為引擎實例接收數據並發送給引擎處理 */
        EPRuntime er = provider.getEPRuntime();
        er.sendEvent(new MyEvent(1,"aaa"));  //發送事件
    }

}

Esper雖然支持了這種方式來注冊事件,但是,仍然建議使用java class的表示事件類型。

【總結】:

Esper事件驅動程序,開發步驟相對來說比較固定,程序實現相對簡單,通過幾個主要API就能實現復雜事件處理。相對來說,編寫滿足需要的EPL語句,比較困難,尤其是當模式匹配、事件流或者數據窗口等結合起來使用時。

后續的更新中會對幾個核心的API進行說明。EPL也會拿出幾個章節進行單獨的介紹。

 


免責聲明!

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



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