前面對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也會拿出幾個章節進行單獨的介紹。