1. 程式人生 > >Esper學習筆記二:程序模型

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