文档章节

Esper学习笔记05-事件处理

巴顿.太一
 巴顿.太一
发布于 2017/07/25 23:38
字数 1104
阅读 7
收藏 0
点赞 0
评论 0

1.UpdateListener

UpdaterListener是Esper提供的一个接口,用于监听某个EPL在引擎中的运行情况,事件进入并产生结果后会通知UpdateListener。接口如下

Java代码 

package com.espertech.esper.client;    
import com.espertech.esper.client.EventBean;    
public interface UpdateListener    
{    
    public void update(EventBean[] newEvents, EventBean[] oldEvents);    

接口很简单,就一个update方法,其中包括两个EventBean数组,至于两个参数的含义稍后再说。EventBean中有一个最常用的get方法,是用来得到EPL中某个字段的值。例如:

Java代码 

EPL:select name from User    
//假设newEvents长度为一    
newEvents[0].get("name")能得到进入的User事件的name属性值    
    
EPL:select count(*) from User.win:time(5 sec)    
//假设newEvents长度为一    
newEvents[0].get("count(*))能得到5秒内进入引擎的User事件数量有多少 

get方法最常用,此外还有getUnderlying等方法,以后会专门写一篇介绍EventBean的。

 

2.Insert and Remove Stream

Insert表示进入引擎,Remove表示移出引擎,事件在Esper中会因为某类EPL才会经历这两种状态。对应于 UpdateListener接口就是newEvents和oldEvents,因为处于这两种状态的事件不一定只有一个,所以newEvents和 oldEvents就是数组形式。举个例子说明下:

从此图可以看出,随着时间推移,每个进入到引擎的W事件都是newEvents,即Insert Stream。W后括号里的值为属性值,可忽略。有人可能要问了,为什么这里oldeEvents什么都没有。那是因为EPL的关系。看下面的例子

注:win:length(5)是个view,详细的后面会专门讲解,这里先暂时理解为Esper开放一个空间并最多可同时存放5个事件(此空间其实就是大小为5的数组)

       由图可知,length window可存放w1,w2等事件,在w6事件进入之前,每个事件进入都属于newEvents。直到w6进入后,length window不能容纳w1~w6的事件,必须把w1事件移出,即w1为oldEvents。length window就像一个队列,每当事件进入队列时,就会触发updateListener并告知有新事件进入。当队列满了,再进入一个新事件时,Esper 会触发UpdateListener告知有新事件进入并且有旧事件移出,正如上图所示的w6和w1。

实际上这个EPL触发监听器都只能看到newEvents,看不到oldEvents。如果想看到oldEvents,EPL要改写一下:

Java代码 

EPL:select irstream * from User.win:length(5)  

 默认情况下,Esper认为你只想让newEvents触发监听器,即istream(insert stream)。如果想让oldEvents触发监听器,那么为rstream(remove stream)。如果两个都想,那么为irstream。当然这个默认情况是可以配置的,以后会说到这个问题。

       不过对于rstream,在我看来他有个bug,因为在运行时我发现,oldEvents触发监听器时,理论上应该是oldEvents这个参数有值,并 且api里也明确说明了这一点(就算他没说明,按照常理推断也应该是oldEvents有值),但是实际上是newEvents有值,oldEvents 为null。虽然说数据没有错,但是这个似乎不合常理。

3.Filter and Where-Clause

EPL有两种过滤事件的方式,一种是过滤事件进入view(可以把view理解为一个窗口),即Filter。另一种是让事件都进入view,但不触发UpdateListener,即Where子句。关于这两种语法后面会详细讲解,这里就只是简单介绍。

Filter:

由图上可以看出,Apple事件先进入view,然后才被where子句过滤,以至于被过滤掉的事件不会作为newEvent触发UpdateListener

其实单看两个EPL,就能发现一个过滤是在进入view前,一个过滤是在view后,所以大家在应用的时候要注意。

4.Aggregation and Grouping

之前说过EPL是类SQL语法,所以也会有聚合和分组的功能。语法和SQL基本一样,下面给大家展示一下:

最后一个和前一个的区别在于name也在统计的范围内,所以当name和price都一样的两个事件进入Esper,会有两个一模一样的事件作为 newEvent触发UpdaterListener,即price,name,sum(amount)都一样。当然要是group by name, price的话,就只会有一个事件触发监听器了。

 

 

© 著作权归作者所有

共有 人打赏支持
巴顿.太一
粉丝 3
博文 67
码字总数 75265
作品 0
海淀
技术主管
事件流处理引擎Esper专题

之前在csdn的博客专栏里没有查到Esper,所以本人抛砖引玉,开设了第一个Esper专栏。如果有大神也在研究Esper,希望能以专栏的形式推广Esper。虽然说小众,但是功能强大。下面我为各位做了简单...

摆渡者 ⋅ 2014/04/10 ⋅ 0

复杂事件处理组件--Esper

Esper 是一个复杂事件处理组件(CEP - Complex Event Processing),它有 Java 版本和 .NET 版本(NEsper)。 Esper 可以让你进行快速的开发一个应用程序用来处理大量的消息和事件,它可以从...

匿名 ⋅ 2012/04/01 ⋅ 0

Android网络请求框架Retrofit使用笔记

Android网络请求框架Retrofit使用笔记 丛林听雨2016-04-05264 阅读 Retrofit是一个安卓端开源网络请求库,目前依赖于okhttp: http://square.github.io/retrofit/ 并提供了多种数据转换工厂和...

丛林听雨 ⋅ 2016/04/05 ⋅ 0

Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang ⋅ 2017/12/26 ⋅ 0

如何利用Flink实现超大规模用户行为分析

各位晚上好,首先感谢大家参与我的这次主题分享,同时也感谢 InfoQ AI 前线组织这次瀚思科技主题月! 瀚思科技成立于 2014 年,按行业划分我们是一家安全公司。但和大家熟知的卖杀毒软件或者...

吴昊 ⋅ 2017/12/14 ⋅ 0

esper输出条数和时间控制

各位大神, 小弟现在需要用esper做批量统计,但是来的事件不确定。所以想从条数和时间两个方面去控制结果输出。 之前用过 select count(*) from Model.win:length_batch(100) group by attr...

flyyounth ⋅ 2015/05/27 ⋅ 0

Netty5入门学习笔记001

Netty官网:http://netty.io/ 本例程使用最新的netty5.x版本编写 服务器端: TimeServer 时间服务器 服务端接收客户端的连接请求和查询当前时间的指令,判断指令正确后响应返回当前服务器的校...

山东小木 ⋅ 2014/12/17 ⋅ 10

Storm笔记

用了一段时间Storm后的笔记。发现可以记的东西不多,证明Storm挺简单的,你只要遵循一些简单的接口与原则,就能写出大规模实时消息处理的程序。 不断更新中,请尽量访问博客原文。 为什么用S...

Adel ⋅ 2016/09/27 ⋅ 0

大数据:美团酒旅实时数据规则引擎应用实践

背景 美团点评酒旅运营需求在离线场景下,已经得到了较为系统化的支持,通过对离线数据收集、挖掘,可对目标用户进行T+1触达,通过向目标用户发送Push等多种方式,在一定程度上提高转化率。但...

meituantech ⋅ 04/19 ⋅ 0

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型。 事件模型简介及常见事件模型 对于采用了图...

全栈Java ⋅ 2017/08/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 28分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 30分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 35分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 38分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 41分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 42分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 45分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 48分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 48分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部