Esper学习之十四:Pattern(一)
1. Pattern Atoms and Pattern operators
Pattern是通过原子事件和操作符组合在一起构成模板。原子事件有3类,操作符有4类,具体如下:
原子事件:
1). 普通事件:包括POJO,Map,Array,XML
2). 时间事件:包括间隔n个时间单位、crontab
3). 自定义插件:用于观察特定事件的发生
操作符:
1). 重复操作符:every, every-distinct, [num] and until
2). 逻辑操作符:and, or, not
3). 顺序操作符:->(Followed by)
4). 事件生命周期操作符:timer:within, timer:withinmax, while-expression, 自定义插件
关于操作符,自然会有优先级,具体如下:
Precedence | Operator | Description | Example |
---|---|---|---|
1 |
guard postfix |
where timer:within and while (expression) (incl. withinmax and plug-in pattern guard) |
MyEvent where timer:within(1 sec) |
2 |
unary |
every, not every, distinct |
every MyEvent |
3 | repeat | [num], until |
[5] MyEvent [1..3] MyEvent until MyOtherEvent |
4 | and | and | every (MyEvent and MyOtherEvent) |
5 | or | or | every (MyEvent or MyOtherEvent) |
6 | followed by | -> | every (MyEvent -> MyOtherEvent) |
上面的内容各位可以先有个印象,方便理解之后的详解。
2. Pattern Filter Expression
Pattern的Filter表达式和普通的表达式没有区别,我就不展开讲解了,各位看看下面几个例子就好,除了Filter之外的东西暂时不用关心是什么意思。
1). every e1=RfidEvent -> e2=RfidEvent(assetId=e1.assetId)
2). every e1=RfidEvent -> e2=RfidEvent(MyLib.isInRadius(e1.x, e1.y, x, y) and zone in (1, e1.zone))
3). every (RfidEvent(zone > 1) and RfidEvent(zone < 10))
3. Controlling Event Consumption
上面说到了Filter,因为Pattern可以由多个原子事件组成,那么Filter自然也会有多个,正常情况下,所有的Filter都会对进入引擎的事件进行判定,但是我们也有只需要判定一次的时候,只要满足了某个Filter,那么其他的Filter就不用管这个事件了。Esper考虑到了这个需求,我们只需要在Filter表达式后面加个@consume注解即可,此注解可以跟随数字,表示过滤的优先级。默认优先级为1,数值越大优先级越高。
为了结合上面几节的知识,我给了个完整的实例:
- package example;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPRuntime;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- import com.espertech.esper.client.EPStatement;
- import com.espertech.esper.client.EventBean;
- import com.espertech.esper.client.UpdateListener;
- /**
- * Created by Luonanqin on 8/11/14.
- */
- class ConsumeEvent {
- private int id;
- private String name;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String toString() {
- return "ConsumeEvent{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
- }
- }
- class PatternConsumeListener1 implements UpdateListener {
- public void update(EventBean[] newEvents, EventBean[] oldEvents) {
- if (newEvents != null) {
- for (int i = 0; i < newEvents.length; i++) {
- System.out.println("a: " + newEvents[i].get("a"));
- System.out.println("b: " + newEvents[i].get("b"));
- }
- }
- }
- }
- class PatternConsumeListener2 implements UpdateListener {
- public void update(EventBean[] newEvents, EventBean[] oldEvents) {
- if (newEvents != null) {
- for (int i = 0; i < newEvents.length; i++) {
- System.out.println("a: " + newEvents[i].get("a"));
- System.out.println("b: " + newEvents[i].get("b"));
- System.out.println("c: " + newEvents[i].get("c"));
- }
- }
- }
- }
- public class PatternConsumeTest {
- public static void main(String[] args) {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- EPRuntime runtime = epService.getEPRuntime();
- String consume = ConsumeEvent.class.getName();
- String epl1 = "every (a=" + consume + "(id = 1)@consume and b=" + consume + "(name = 'luonq'))";
- System.out.println("EPL1: " + epl1 + "\n");
- EPStatement stat1 = admin.createPattern(epl1);
- stat1.addListener(new PatternConsumeListener1());
- ConsumeEvent ce1 = new ConsumeEvent();
- ce1.setId(1);
- ce1.setName("luonq");
- System.out.println("Send Event: " + ce1);
- runtime.sendEvent(ce1);
- System.out.println();
- ConsumeEvent ce2 = new ConsumeEvent();
- ce2.setId(2);
- ce2.setName("luonq");
- System.out.println("Send Event: " + ce2);
- runtime.sendEvent(ce2);
- stat1.destroy();
- System.out.println();
- String epl2 = "every (a=" + consume + "(id = 1)@consume(2) or b=" + consume + "(name = 'luonq')@consume(3) or c=" + consume + "(age > 2))";
- System.out.println("EPL2: " + epl2 + "\n");
- EPStatement stat2 = admin.createPattern(epl2);
- stat2.addListener(new PatternConsumeListener2());
- ConsumeEvent ce3 = new ConsumeEvent();
- ce3.setId(1);
- ce3.setName("luonq");
- ce3.setAge(3);
- System.out.println("Send Event: " + ce3);
- runtime.sendEvent(ce3);
- ConsumeEvent ce4 = new ConsumeEvent();
- ce4.setId(1);
- ce4.setName("luonqin");
- ce4.setAge(1);
- System.out.println("Send Event: " + ce4);
- runtime.sendEvent(ce4);
- ConsumeEvent ce5 = new ConsumeEvent();
- ce5.setId(3);
- ce5.setName("luonqin");
- ce5.setAge(5);
- System.out.println("Send Event: " + ce5);
- runtime.sendEvent(ce5);
- }
- }
执行结果:
- EPL1: every (a=example.ConsumeEvent(id = 1)@consume and b=example.ConsumeEvent(name = 'luonq'))
- Send Event: ConsumeEvent{id=1, name='luonq', age=0}
- Send Event: ConsumeEvent{id=2, name='luonq', age=0}
- a: ConsumeEvent{id=1, name='luonq', age=0}
- b: ConsumeEvent{id=2, name='luonq', age=0}
- EPL2: every (a=example.ConsumeEvent(id = 1)@consume(2) or b=example.ConsumeEvent(name = 'luonq')@consume(3) or c=example.ConsumeEvent(age > 2))
- Send Event: ConsumeEvent{id=1, name='luonq', age=3}
- a: null
- b: ConsumeEvent{id=1, name='luonq', age=3}
- c: null
- Send Event: ConsumeEvent{id=1, name='luonqin', age=1}
- a: ConsumeEvent{id=1, name='luonqin', age=1}
- b: null
- c: null
- Send Event: ConsumeEvent{id=3, name='luonqin', age=5}
- a: null
- b: null
- c: ConsumeEvent{id=3, name='luonqin', age=5}
这里先简单说明下,every关键字表示引擎把每个事件都进行Pattern的匹配,而不管上一个匹配是否完成。or和and就是或和且的意思,表示满足某个以及满足所有。
去掉consume的执行结果:
- EPL1: every (a=example.ConsumeEvent(id = 1) and b=example.ConsumeEvent(name = 'luonq'))
- Send Event: ConsumeEvent{id=1, name='luonq', age=0}
- a: ConsumeEvent{id=1, name='luonq', age=0}
- b: ConsumeEvent{id=1, name='luonq', age=0}
- Send Event: ConsumeEvent{id=2, name='luonq', age=0}
- EPL2: every (a=example.ConsumeEvent(id = 1) or b=example.ConsumeEvent(name = 'luonq') or c=example.ConsumeEvent(age > 2))
- Send Event: ConsumeEvent{id=1, name='luonq', age=3}
- a: ConsumeEvent{id=1, name='luonq', age=3}
- b: null
- c: null
- Send Event: ConsumeEvent{id=1, name='luonqin', age=1}
- a: ConsumeEvent{id=1, name='luonqin', age=1}
- b: null
- c: null
- Send Event: ConsumeEvent{id=3, name='luonqin', age=5}
- a: null
- b: null
- c: ConsumeEvent{id=3, name='luonqin', age=5}
上面的例子可能看得不是很懂,不过没关系,等到后面讲操作符进行详解后再来回顾就很简单了。
Esper学习之十四:Pattern(一)的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- Linux学习之十四、管线命令
Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php
- 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击
风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...
- Esper学习之十二:EPL语法(八)
今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- Esper学习之十五:Pattern(二)
上一篇开始了新一轮语法——Pattern的讲解,一开始为大家普及了几个基础知识,其中有说到操作符.当时只是把它们都列举出来了,所以今天这篇就是专门详解这些操作符的,但是由于篇幅限制,本篇先会讲几个,剩 ...
- Esper学习之十:EPL语法(六)
在esper的文档中,epl访问数据库的配置放在了比较靠后的位置,不过为了方便各位学习,这里会先说明和数据库交互的相关配置,然后再说epl怎么访问数据库. 配置文件在官方esper包的etc文件夹下, ...
- javascript基础学习(十四)
javascript之表单对象 学习要点: 表单对象 文本框 按钮 单选框和复选框 一.表单对象 在HTML文档中可能会出现多个表单,也就是说,一个HTML文档中可能出现多个<form>标 ...
- JMeter学习(十四)JMeter函数学习(转载)
转载自 http://www.cnblogs.com/yangxia-test JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functio ...
随机推荐
- Python 判断文件是否存在的三种方法
通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块.Try ...
- 绚丽而实用的jQuery/CSS3应用及源码
HTML5加入WEB以后,网页世界就变得丰富绚丽起来了,但是我们在项目应用中,不仅需要绚丽的动画效果,而且更需要有实用的价值.今天分享的一些jQuery/CSS3应用不仅绚丽,而且还比较实用,如果感兴 ...
- Centos下查看cpu、磁盘、内存使用情况以及如何清理内存
核查服务器基本情况 查看内存使用情况 free -m 查看cpu使用情况 top #查看进程运行情况 查看磁盘以及分区情况 df -h 查看网络情况 ifconfig 查看端口使用情况 #1.方法一 ...
- 分页功能实现之通过ajax实现表单内容刷新
拿代码来说话 我们的需求就是点击翻页功能,实现表格内容局部刷新且能够翻到对应的页面上,不明白? 那么就看看下面的图,需要达到的效果如下所示: 现在要实现的功能就是把红线框起来的表单内容 在点击翻页的时 ...
- redis 的set数据类型
相关命令 1.SADD SADD key-name item1 [item 2…] 将一个或多个成员元素加入到集合中 2.SREM SMEMBERS key-name item1 [item 2…] ...
- Sublime的插件Color Highlighter的安装方法
ColorHighlighter是一个显示选中颜色代码的视觉颜色的插件.如果您选择“# fff“,它将向您展示白色.ColorHighlighter支持所有CSS颜色格式,如Hex,RGB,HSL,H ...
- python中的字符串常量,是否支持通过下标的方式赋值
说明: 今天在看python,通过下标获取字符串常量的字符,在想是否可以通过下标的方式赋值. 操作: 1.对字符串下标赋值 >>> text='python' >>> ...
- git branch 命令
1.git init 该命令执行之后并没有创建branch 2.git add 添加文件,这时branch 也还没生成.git branch name也没用 3.git commit 提交到git r ...
- android studio 导入第三方库的记录
android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...
- js获取视频截图
参考:https://segmentfault.com/q/1010000006717959问题:a.获取的好像是第一帧的图?第一帧为透明图时,获取的个透明图片b.得先加载视频到video,做视频上传 ...