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