文档章节

Esper学习笔记04-MAP事件类型

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

Esper支持原生Java Map结构的事件。相对于POJO来说,Map的结构更利于事件类型的热加载,毕竟不是class,所以不需要重启JVM。所以如果系统对重启比较敏感, 建议使用Map来定义事件的结构。Map的结构很简单,主要分为事件定义名和事件属性列表。我们继续拿Person来讲解.

 

Java代码 

  1. import java.util.HashMap;    
  2. import java.util.List;    
  3. import java.util.Map;    
  4.     
  5. import com.espertech.esper.client.EPAdministrator;    
  6. import com.espertech.esper.client.EPServiceProvider;    
  7. import com.espertech.esper.client.EPServiceProviderManager;    
  8.     
  9.     
  10. public class PersonMap    
  11. {    
  12.     public static void main(String[] args)    
  13.     {    
  14.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  15.         EPAdministrator admin = epService.getEPAdministrator();    
  16.             
  17.         // Person定义    
  18.         Map<String,Object> person = new HashMap<String,Object>();    
  19.         person.put("name", String.class);    
  20.         person.put("age", int.class);    
  21.         person.put("children", List.class);    
  22.         person.put("phones", Map.class);    
  23.             
  24.         // 注册Person到Esper    
  25.         admin.getConfiguration().addEventType("Person", person);    
  26.     }    
  27. }   

如上所示,Map结构的事件需要将属性名作为key,属性的数据类型作为value保存到Map中,然后再通过Esper的接口注册到Esper。其中addEventType的两个参数分别代表事件定义的名称和所定义的结构

对应的EPL和POJO的没有区别

  1. // 当Person类型的事件中name为luonanqin时,Esper能得到对应的age,children    
  2. select age,children from Person where name="Jordan"  

 Map对于嵌套类的定义比较特别。如果嵌套的类是POJO,那就如上面所示。如果嵌套的还是Map,那么定义方式就需要改变。我们为Person加上Address,示例如下:

Java代码 

  1. import java.util.HashMap;    
  2. import java.util.List;    
  3. import java.util.Map;    
  4.     
  5. import com.espertech.esper.client.EPAdministrator;    
  6. import com.espertech.esper.client.EPServiceProvider;    
  7. import com.espertech.esper.client.EPServiceProviderManager;    
  8.     
  9. public class PersonMap    
  10. {    
  11.     public static void main(String[] args)    
  12.     {    
  13.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  14.         EPAdministrator admin = epService.getEPAdministrator();    
  15.     
  16.         // Address定义    
  17.         Map<String, Object> address = new HashMap<String, Object>();    
  18.         address.put("road", String.class);    
  19.         address.put("street", String.class);    
  20.         address.put("houseNo", int.class);    
  21.     
  22.         // Person定义    
  23.         Map<String, Object> person = new HashMap<String, Object>();    
  24.         person.put("name", String.class);    
  25.         person.put("age", int.class);    
  26.         person.put("children", List.class);    
  27.         person.put("phones", Map.class);    
  28.         person.put("address", "Address");    
  29.     
  30.         // 注册Address到Esper    
  31.         admin.getConfiguration().addEventType("Address", address);    
  32.         // 注册Person到Esper    
  33.         admin.getConfiguration().addEventType("Person", person);    
  34.     }    
  35. }    

 

Java代码 

如上所示,有两个关键点:  

1.Person在定义Address属性时,map的value不是Address.class,而是Address字符串,而这就代表引擎里的Address对应的Map结构定义  

2.事件定义注册必须是Address先于Person,因为Person用到了Address,而引擎是根据Address注册时用的名字去查找Address定义的,所以如果名字写错,引擎就找不到Address了  。

另外对于Map,Esper只支持增量更新,也就是说只能增加Map中的属性定义,而不能修改或者删除某个属性(实际上属性增多并不影响其处理性能,所以 没有删除在我看来也没什么。至于修改,也只能是先注销再注册了)。我们为Person增加一个gender属性,示例如下:

Java代码 

  1. import java.util.Arrays;    
  2. import java.util.HashMap;    
  3. import java.util.List;    
  4. import java.util.Map;    
  5.     
  6. import com.espertech.esper.client.EPAdministrator;    
  7. import com.espertech.esper.client.EPServiceProvider;    
  8. import com.espertech.esper.client.EPServiceProviderManager;    
  9. import com.espertech.esper.client.EventType;    
  10.     
  11. public class PersonMap    
  12. {    
  13.     public static void main(String[] args)    
  14.     {    
  15.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  16.         EPAdministrator admin = epService.getEPAdministrator();    
  17.     
  18.         // Address定义    
  19.         Map<String, Object> address = new HashMap<String, Object>();    
  20.         address.put("road", String.class);    
  21.         address.put("street", String.class);    
  22.         address.put("houseNo", int.class);    
  23.     
  24.         // Person定义    
  25.         Map<String, Object> person = new HashMap<String, Object>();    
  26.         person.put("name", String.class);    
  27.         person.put("age", int.class);    
  28.         person.put("children", List.class);    
  29.         person.put("phones", Map.class);    
  30.         person.put("address", "Address");    
  31.     
  32.         // 注册Address到Esper    
  33.         admin.getConfiguration().addEventType("Address", address);    
  34.         // 注册Person到Esper    
  35.         admin.getConfiguration().addEventType("Person", person);    
  36.     
  37.         // 新增一个gender属性    
  38.         person.put("gender", int.class);    
  39.         admin.getConfiguration().updateMapEventType("Person", person);    
  40.             
  41.         /** 输出结果:  
  42.          * Person props: [address, age, name, children, phones, gender]  
  43.          */    
  44.         EventType event = admin.getConfiguration().getEventType("Person");    
  45.         System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));    
  46.     }    
  47. }    

 

3.Object Array

 

对象数组和Map很像,基本没有差别。只是定义方式不一样,Esper同样也只支持增量更新。这里继续用Person作为例子:

Java代码 

  1. import java.util.Arrays;    
  2. import java.util.Map;    
  3.     
  4. import com.espertech.esper.client.EPAdministrator;    
  5. import com.espertech.esper.client.EPServiceProvider;    
  6. import com.espertech.esper.client.EPServiceProviderManager;    
  7. import com.espertech.esper.client.EventType;    
  8.     
  9. public class PersonArray    
  10. {    
  11.     
  12.     /**  
  13.      * @param args  
  14.      */    
  15.     public static void main(String[] args)    
  16.     {    
  17.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  18.         EPAdministrator admin = epService.getEPAdministrator();    
  19.     
  20.         // Address定义    
  21.         String[] addressPropNames = { "road", "street", "houseNo" };    
  22.         Object[] addressPropTypes = { String.class, String.class, int.class };    
  23.     
  24.         // Child定义    
  25.         String[] childPropNames = { "name", "age" };    
  26.         Object[] childPropTypes = { String.class, int.class };    
  27.     
  28.         // Person定义    
  29.         String[] personPropNames = { "name", "age", "children", "phones", "address" };    
  30.         Object[] personPropTypes = { String.class, int.class, "Child[]", Map.class, "Address" };    
  31.     
  32.         // 注册Address到Esper    
  33.         admin.getConfiguration().addEventType("Address", addressPropNames, addressPropTypes);    
  34.         // 注册Child到Esper    
  35.         admin.getConfiguration().addEventType("Child", childPropNames, childPropTypes);    
  36.         // 注册Person到Esper    
  37.         admin.getConfiguration().addEventType("Person", personPropNames, personPropTypes);    
  38.     
  39.         // 新增一个gender属性    
  40.         admin.getConfiguration().updateObjectArrayEventType("Person", new String[] { "gender" }, new Object[] { int.class });    
  41.     
  42.         /** 输出结果:  
  43.          * Person props: [name, age, children, phones, address, gender]  
  44.          */    
  45.         EventType event = admin.getConfiguration().getEventType("Person");    
  46.         System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));    
  47.     }    
  48. }    

 

上面的例子包含了对象数组这种事件格式的所有特性。

© 著作权归作者所有

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

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

摆渡者 ⋅ 2014/04/10 ⋅ 0

RxJava 学习笔记 (二)

作者: 一字马胡 转载标志 【2017-12-15】 更新日志 日期 更新内容 备注 2017-12-15 RxJava学习笔记系列 系列笔记 (二) 导入 在RxJava学习笔记系列的第一篇文章中,我分析了RxJava中核心的...

一字马胡 ⋅ 2017/12/15 ⋅ 0

Golang学习笔记目录

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

ChainZhang ⋅ 2017/12/26 ⋅ 0

复杂事件处理组件--Esper

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

匿名 ⋅ 2012/04/01 ⋅ 0

go语言文件汇总

归并排序及go语言实现 堆排序算法及go语言实现 Go语言基础学习(一)变量 【Leetcode】:Counting Bits问题 in Go语言 基于go语言的心跳响应 【Leetcode】:Single Number III问题 in Go语言 ...

d_watson ⋅ 2016/04/15 ⋅ 2

Scala 学习笔记 模式匹配

1. 模式匹配简介 模式匹配是 Scala 的重要特性之一,前面两篇笔记Scala学习笔记(六) Scala的偏函数和偏应用函数、Scala学习笔记(七) Sealed Class 和 Enumeration都是为了这一篇而铺垫准备的...

Tony沈哲 ⋅ 2017/05/16 ⋅ 0

Web开发系列 - GIS

Google Maps JQuery Maps google map是怎样工作的 Google Maps API编程资源大全 google map限制地图缩放级别和显示范围 WebGIS近来学习小结,GoogleMap影像在线矢量化简述 google map v3 ap...

长征2号 ⋅ 2017/08/09 ⋅ 0

RxJava 2 学习笔记 (一)

作者: 一字马胡 转载标志 【2017-12-13】 更新日志 日期 更新内容 备注 2017-12-13 RxJava2学习笔记系列 系列笔记 (一) 导入 其实在很早以前就接触过RxJava,并且当时学习RxJava还有一个产...

一字马胡 ⋅ 2017/12/13 ⋅ 0

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

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

吴昊 ⋅ 2017/12/14 ⋅ 0

Spring3 MVC 笔记(二) —json+rest优化

接上次的 spring mvc 注解的一些详细信息! 其实也是一些个人的学习笔记 呵呵! http://7454103.iteye.com/blog/716975 有了上面的基础! 一起来研究些其他的东西! 前端时间写了个 struts2 ...

李长春 ⋅ 2011/09/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 今天 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部