UpdaterListener是Esper提供的一個接口,用於監聽某個EPL在引擎中的運行狀況,即事件進入併產生結果後會通知UpdateListener。數組
接口以下:spa
package com.espertech.esper.client; import com.espertech.esper.client.EventBean; public interface UpdateListener { public void update(EventBean[] newEvents, EventBean[] oldEvents); }
接口中就包含一個update方法,該方法有兩個參數newEvents和oldEvents。兩個參數均是EventBean數組。EventBean中有一個最經常使用的get方法用戶獲取EPL中字段的值。.net
//EPL語句 select name,age,avg(age) as avgAge from myEvent eventBean.get("name")//獲取name屬性 eventBean.get("age")//獲取age屬性 eventBean.get("avgAge")//獲取平均年齡屬性
insert表示進入引擎,remove表示移除引擎。事件在Esper中會由於某類EPL會經歷這兩種狀態。對應於UpdateListener接口就是newEvents和oldEvents,由於處於這兩種狀態的事件不必定只有一個,因此newEvents和oldEvents就是數組形式。code
今後圖能夠看出,隨着時間推移,每一個進入到引擎的W事件都是newEvents,即Insert Stream。W後括號裏的值爲屬性值,可忽略。blog
默認狀況下EPL是不會講數據寫入oldEvents中的。接口
看下面EPL例子隊列
select irstream name,age,avg(age) as avgAge from myEvent.win:length(5)
由圖可知,length window可存放w1,w2等事件,在w6事件進入以前,每一個事件進入都屬於newEvents。直到w6進入後,length window不能容納w1~w6的事件,必須把w1事件移出,即w1爲oldEvents。length window就像一個隊列,每當事件進入隊列時,就會觸發updateListener並告知有新事件進入。當隊列滿了,再進入一個新事件時,Esper會觸發UpdateListener告知有新事件進入而且有舊事件移出,正如上圖所示的w6和w1。事件
EPL有兩種過濾事件的方式,一種是過濾事件進入view(能夠把view理解爲一個窗口),即Filter。另外一種是讓事件都進入view,但不觸發UpdateListener,即Where子句。rem
select name,age,avg(age) as avgAge from myEvent(amount>200).win:length(5)
從圖上能夠看出,只有amount大於200,Esper才容許Apple事件進入view,而且做爲一個newEvent觸發UpdateListener。get
select name,age,avg(age) as avgAge from myEvent.win:length(3) where amount>200
從上圖能夠看出,全部事件都會進入view,只有知足條件事件才能進入newEvent。
其實單看兩個EPL,就能發現一個過濾是在進入view前,一個過濾是在view後,因此你們在應用的時候要注意。
以前說過EPL是類SQL語法,因此也會有聚合和分組的功能。語法和SQL基本同樣。
//長度窗口內,計算平均數 select name,age,avg(age) as avgAge from myEvent.win:length(3) //長度窗口內,計算年齡總和 select name,age,sum(age) as sumAge from myEvent.win:length(3) //長度窗口內,按照姓名和年齡統計 select name,age,sum(age) as sumAge from myEvent.win:length(5) group by name,age //長度窗口內,按照姓名分組統計,不一樣年齡數量 select name,count(distinct(age)) as counts from myEvent.win:length(5) group by name
轉載:https://blog.csdn.net/luonanqin/article/details/10714687