Esper學習筆記二:程序模型
1.UpdateListener
UpdaterListener是Esper提供的一個介面,用於監聽某個EPL在引擎中的執行情況,即事件進入併產生結果後會通知UpdateListener。
介面如下:
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中欄位的值。
//EPL語句
select name,age,avg(age) as avgAge from myEvent
eventBean.get("name")//獲取name屬性
eventBean.get("age")//獲取age屬性
eventBean.get("avgAge")//獲取平均年齡屬性
2.Insert 和 Remove
insert表示進入引擎,remove表示移除引擎。事件在Esper中會因為某類EPL會經歷這兩種狀態。對應於UpdateListener介面就是newEvents和oldEvents,因為處於這兩種狀態的事件不一定只有一個,所以newEvents和oldEvents就是陣列形式。
從此圖可以看出,隨著時間推移,每個進入到引擎的W事件都是newEvents,即Insert Stream。W後括號裡的值為屬性值,可忽略。
預設情況下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。
3.Filter and Where
EPL有兩種過濾事件的方式,一種是過濾事件進入view(可以把view理解為一個視窗),即Filter。另一種是讓事件都進入view,但不觸發UpdateListener,即Where子句。
Filter:過濾滿足條件事件進入view
select name,age,avg(age) as avgAge from myEvent(amount>200).win:length(5)
從圖上可以看出,只有amount大於200,Esper才允許Apple事件進入view,並且作為一個newEvent觸發UpdateListener。
Where:所有事件都進入view
select name,age,avg(age) as avgAge from myEvent.win:length(3) where amount>200
從上圖可以看出,所有事件都會進入view,只有滿足條件事件才能進入newEvent。
其實單看兩個EPL,就能發現一個過濾是在進入view前,一個過濾是在view後,所以大家在應用的時候要注意。
4.Aggregation and Grouping
之前說過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