esper java_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就是数组形式。

38b9beea23eca696967157d18bdcc5b3.png

从此图可以看出,随着时间推移,每个进入到引擎的W事件都是newEvents,即Insert Stream。W后括号里的值为属性值,可忽略。

默认情况下EPL是不会讲数据写入oldEvents中的。

看下面EPL例子

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

4c3dfbef4519287f4ecdb915329d4690.png

由图可知,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)

7a580c8e2c72199883a98de39a03f8aa.png

从图上可以看出,只有amount大于200,Esper才允许Apple事件进入view,并且作为一个newEvent触发UpdateListener。

Where:所有事件都进入view

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

2f6c7ea0fb4fca23699321f46c2f43ca.png

从上图可以看出,所有事件都会进入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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值