Esper學習筆記二:進程模型

1.UpdateListener

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")//獲取平均年齡屬性

2.Insert 和 Remove

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。事件

3.Filter and Where

EPL有兩種過濾事件的方式,一種是過濾事件進入view(能夠把view理解爲一個窗口),即Filter。另外一種是讓事件都進入view,但不觸發UpdateListener,即Where子句。rem

Filter:過濾知足條件事件進入view

select name,age,avg(age) as avgAge from myEvent(amount>200).win:length(5)

從圖上能夠看出,只有amount大於200,Esper才容許Apple事件進入view,而且做爲一個newEvent觸發UpdateListener。get

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

相關文章
相關標籤/搜索