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

猜你喜欢

转载自my.oschina.net/u/3100849/blog/1936677