文档章节

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

东皇巴顿
 东皇巴顿
发布于 2017/07/25 23:09
字数 998
阅读 9
收藏 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
博文 62
码字总数 73311
作品 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学习笔记二:进程模型

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

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

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

贾峰uk
09/03
0
0
RxJava 学习笔记 (二)

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

一字马胡
2017/12/15
0
0
Golang学习笔记目录

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

ChainZhang
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

 SQL与NoSQL数据库入门基础知识详解

这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者。有自学hadoop的,有报名培训班学习的。所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境、修改配置文件测试等...

左手的倒影
1分钟前
0
0
Jenkinsfile

node { wrap([$class: 'BuildUser']) { def user = env.BUILD_USER_ID println user }}def InPutCheckBranch(){ timeout(time:10, unit:'SECONDS') { I......

whhbb
6分钟前
0
0
如何去设计前端框架能力?星巴克消息开放项目从0到1,从点到面的思考

本文由淘宝前端工程师罗嗣分享,主要讲述了作者在星巴克消息开放项目中的总结和思考,希望对大家有帮助,让业务分享更加有价值。 摘要 从满足星巴克项目需求单点出发,发散到从点到面的思考。...

阿里云官方博客
11分钟前
0
0
如何在多Kubernetes集群和多租户环境中使用Prometheus监控

过去十年里,我一直在虚拟化和云计算领域工作,在VMware、Mercury Interactive和Oracle领导产品管理工作,并格外关注DevOps方向。直到2014年,我开始认真关注并研究容器。当2015年Kubernete...

RancherLabs
12分钟前
0
0
如何在Chrome浏览器中启动deviceready事件(尝试调试phonegap项目)?

我正在开发PhoneGap应用程序,我希望能够在Chrome中调试它,而不是在电话上调试。但是,我在onGetReady()函数中初始化我的代码,该函数在PhoneGap触发“deviceready”事件时触发。由于Chr...

kisshua
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部