博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Esper学习笔记二:进程模型
阅读量:7063 次
发布时间:2019-06-28

本文共 2127 字,大约阅读时间需要 7 分钟。

hot3.png

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 myEventeventBean.get("name")//获取name属性eventBean.get("age")//获取age属性eventBean.get("avgAge")//获取平均年龄属性

2.Insert 和 Remove

insert表示进入引擎,remove表示移除引擎。事件在Esper中会因为某类EPL会经历这两种状态。对应于UpdateListener接口就是newEvents和oldEvents,因为处于这两种状态的事件不一定只有一个,所以newEvents和oldEvents就是数组形式。

de3bd27b27865f0286b867f990d029dc556.jpg

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

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

看下面EPL例子

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

a86c534615880086d837b4bedcfffee7a54.jpg

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

e0adbadc8cbdcf13f8fba0f9cf8f1f25178.jpg

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

Where:所有事件都进入view

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

36a3b393df508d851396504f4a4bed4f31c.jpg

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

转载于:https://my.oschina.net/u/3100849/blog/1936677

你可能感兴趣的文章
Postgresql 数据库,如何进行数据备份以及导入到另外的数据库
查看>>
python之闭包、装饰器
查看>>
实现单例模式的9个方法
查看>>
Java的接口总结
查看>>
C++复习
查看>>
cpsr与cpsr_c的区别
查看>>
星星评分
查看>>
Django - - Django REST framework基础:分页
查看>>
no module name cx_oracle 的解决方法
查看>>
poj - 2240 Arbitrage
查看>>
springmvc文件上传
查看>>
TypeScript 学习笔记
查看>>
Selenium3+python3-发送添加附件的邮件
查看>>
移动端-必要知识
查看>>
Redis指令
查看>>
Date12
查看>>
HTTP协议09-响应首部字段
查看>>
【原创】MySQL新旧版本ORDER BY 处理方法
查看>>
Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
查看>>
linux shell单引号、双引号及无引号区别(考试题答案系列)
查看>>