事件(Event):通常狀況下指的是一個系統中正在發生的事,事件可能發生在系統的各個層面上,它能夠是某個動做,例如客戶下單,發送消息,提交報告等,也能夠是某種狀態的改變,例如溫度的變化,超時等等。事件處理(Event processing)指的是跟蹤系統中發生的事件,分析事件中的信息並從中獲得某種結論。而復瑣事件處理,則是結合多個事件源中的事件,從中推斷出更加複雜的狀況下的事件。html
實現一個CEP引擎咱們須要思考的問題:(1)吞吐量;(2)低延遲;(3)複雜邏輯處理。java
Esper是一個開源的復瑣事件處理引擎,它的目的是讓用戶可以經過它提供的接口,構建一個用於處理復瑣事件的應用程序數據庫
從Esper的架構圖中咱們能夠看出,它包含三個部分:Input adapter,Esper engine,Output adapter。數組
輸入適配器和輸出適配器的主要目的是接收來自不一樣事件源的事件,並向不一樣的目的地輸出事件。 目前,Esper提供的適配器包括File Input and Output adpter, Spring JMS Input and Output Adapter, AMQP Input and Output Adapter, Kafka Adapter等等。這些適配器提供了一系列接口,可讓用戶從不一樣的數據源讀取數據,並將數據發送給不一樣的目的數據源,用戶能夠不用本身單獨編寫客戶端代碼來鏈接這些數據源,感受至關於對這些數據源提供了一層封裝。數據結構
Esper引擎是處理事件的核心,它容許用戶定義須要接收的事件以及對這些事件的處理方式。架構
Esper支持多種事件表現形勢:包括遵循JavaBean方式的含有getter方法的Java POJO(普通Java對象),實現了Map接口的對象,對象數組,XML文檔對象,以及Apache Avro(一個支持JSON和Schema的數據序列化系統,能夠將數據結構或對象轉化成便於存儲和傳輸的格式)。 這些事件表現形式的共同之處在於,它們都提供了事件類型的元數據,也就是說可以表示事件的一系列屬性,例如,一個Java對象能夠經過其成員變量來表示其事件屬性,一個Map對象可以經過鍵值對來表示屬性。因而可知,本質上事件是一系列屬性值的集合,對事件的操做即對事件中的部分或所有屬性的操做。ide
Esper事件處理模型主要包含兩部分:(1)Statement 利用Esper的事件處理語言EPL聲明對事件進行的操做,Esper中提供了多種類型的事件操做,包括過濾、加窗、事件聚合等等。EPL是一種相似於SQL的語言,從這一點上來看,Esper剛好與數據庫相反,數據庫時保存數據,並在數據上運行查詢語句,而Esper是保存查詢語句,在這些查詢上運行數據,只要事件與查詢條件匹配,Esper就會實時進行處理,而不是隻有在查詢提交的時候才處理。(2)Listener用於監聽事件的處理狀況,接收事件處理的結果,經過UpdateListener接口來實現,它至關於一個回調函數,當事件處理完成以後,能夠經過該回調函數向結果發送到目的地。函數
舉例一個用戶註冊事件:定義事件對象包含name和age屬性實現get方法,實時統計註冊用戶的平均年齡。測試
定義事件類this
public class MyEvent { private String name; private int age; public MyEvent() { } public MyEvent(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
測試對事件的操做
public class EsperTest { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.addEventType("myEvent", MyEvent.class); EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider(conf); EPAdministrator admin = provider.getEPAdministrator(); EPStatement statement = admin.createEPL("select name,age,avg(age) as avgAge from myEvent"); statement.addListener(new UpdateListener() { @Override public void update(EventBean[] newEvents, EventBean[] oldEvents) { for (EventBean eb : newEvents) { System.out.println("註冊用戶姓名:"+eb.get("name")+",註冊用戶年齡:"+eb.get("age")+",平均年齡:"+eb.get("avgAge")); } } }); EPRuntime epr = provider.getEPRuntime(); epr.sendEvent(new MyEvent("sean", 30)); epr.sendEvent(new MyEvent("sime", 25)); epr.sendEvent(new MyEvent("jack",28)); epr.sendEvent(new MyEvent("lulcy",26)); epr.sendEvent(new MyEvent("duck", 35)); } }
執行結果
註冊用戶姓名:sean,註冊用戶年齡:30,平均年齡:30.0 註冊用戶姓名:sime,註冊用戶年齡:25,平均年齡:27.5 註冊用戶姓名:jack,註冊用戶年齡:28,平均年齡:27.666666666666668 註冊用戶姓名:lulcy,註冊用戶年齡:26,平均年齡:27.25 註冊用戶姓名:duck,註冊用戶年齡:35,平均年齡:28.8
轉載:https://www.cnblogs.com/yitudake/p/6747990.html