文档章节

Esper学习笔记05-事件处理

东皇巴顿
 东皇巴顿
发布于 2017/07/25 23:38
字数 1104
阅读 11
收藏 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
博文 62
码字总数 73311
作品 0
海淀
技术主管
Esper学习笔记二:进程模型

1.UpdateListener UpdaterListener是Esper提供的一个接口,用于监听某个EPL在引擎中的运行情况,即事件进入并产生结果后会通知UpdateListener。 接口如下: 接口中就包含一个update方法,该方...

贾峰uk
08/30
0
0
Esper学习笔记三:EPL语法(1)

1.EPL语法简介 EPL全称Event Processing Language,是一种类似SQL的语言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同时用事件流代替了table作为数据源,并且能像SQL...

贾峰uk
08/30
0
0
复杂事件处理组件--Esper

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

匿名
2012/04/01
7K
0
Esper学习笔记五:EPL语法(3)

1.Aggregation 类似于SQL中的聚合函数,EPL中聚合函数格式如下: aggregate_function就是聚合函数的名字,比如avg,sum等。expression通常是事件流的某个属性,也可以是不同事件流的多个属性...

贾峰uk
09/03
0
0
Esper学习笔记四:EPL语法(2)

1.select 查询所有属性或特定属性 EPL的select和SQL的select很相近,SQL用表示查询表的所有字段,而EPL用表示查询事件流的所有属性值。SQL查询某个字段名,直接在select后跟字段名就ok,EPL...

贾峰uk
08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Go interface{} to string

package mainimport "fmt"func main() {var a interface{}a = "dsadjaldaldad"var b stringb = a.(string) // 话说,用人话说的话,这叫什么操作?fmt.Println(a, b)}...

taadis
24分钟前
0
0
数据库防火墙

数据库防火墙顾名思义是一款数据(库)安全设备,从防火墙这个词可以看出,其主要作用是做来自于外部的危险隔离。换句话说,数据库防火墙应该在入侵在到达数据库之前将其阻断,至少需要在入侵...

突突突酱
34分钟前
1
0
RDBMS 关系型数据库与 NoSQL 全面比较

随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 低延迟的读写速度:应用快速地反应能极大地提升用户的满...

PeakFang-BOK
42分钟前
1
0
徒弟做了一个Python的实战小项目——银行系统

国际惯例:实践是检验真理的唯一标准。 众所周知,在编程过程中理论知识再充实也需要通过项目的炼金石。下面给大家看一下我徒弟做的一个小项目实战要求,是做一个银行系统,就是我们去银行办...

无也Python
49分钟前
2
0
vue.js响应式原理解析与实现

从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新...

peakedness丶
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部