Esper学习之二:事件类型
Esper对事件有特殊的数据结构约定。能处理的事件结构有:POJO,java.util.Map,Object Array,XML
1.POJO
对于POJO,Esper要求对每一个私有属性要有getter方法。Esper允许不必按照JavaBean规定的格式,但是getter方法是必须的。又或者可以在配置文件中配置可访问的方法来代替getter。简单示例如下
- public class Person
- {
- String name;
- int age;
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
Esper同样也能支持复杂的数据类型以及嵌套。稍微复杂的Person如下
- import java.util.List;
- import java.util.Map;
- public class Person
- {
- String name;
- int age;
- List<Child> children;
- Map<String, Integer> phones;
- Address address;
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public List<Child> getChildren()
- {
- return children;
- }
- public Map<String, Integer> getPhones()
- {
- return phones;
- }
- public Address getAddress()
- {
- return address;
- }
- }
- class Child
- {
- String name;
- int gender;
- // 省略getter方法
- }
- class Address
- {
- String road;
- String street;
- int houseNo;
- // 省略getter方法
- }
如上所示,Esper能支持包含了集合类型和嵌套类的POJO,示例的EPL语句如下
- // 当Person类型的事件中name为luonanqin时,Esper能得到对应的age,children和address
- select age,children,address from Person where name="luonanqin"
如果我不想要所有的child,而是想要第二个。并且我想得到家里的电话号码,那么Person需要改动一下
- import java.util.List;
- import java.util.Map;
- public class Person
- {
- String name;
- int age;
- List<Child> children;
- Map<String, Integer> phones;
- Address address;
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public Child getChildren(int index)
- {
- return children.get(index);
- }
- public int getPhones(String name)
- {
- return phones.get(name);
- }
- public Address getAddress()
- {
- return address;
- }
- // Address,Child不变
- }
对应的EPL如下
- // 当Person类型的事件中name为luonanqin时,Esper能得到对应的第二个孩子,家里的电话和家庭住址在哪条路上
- select children[1], phones('home'), address.road where Person where name="luonanqin"
Esper支持事件的更新,对此Esper要求提供对应的setter方法。Person需要再有点小该度。示例如下
- import java.util.List;
- import java.util.Map;
- public class Person
- {
- String name;
- int age;
- List<Child> children;
- Map<String, Integer> phones;
- Address address;
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public Child getChildren(int index)
- {
- return children.get(index);
- }
- // 此方法用于phones属性的更新
- public void setPhones(String name, Integer number){
- phones.put(name, number);
- }
- public int getPhones(String name)
- {
- return phones.get(name);
- }
- public Address getAddress()
- {
- return address;
- }
- // Address,Child不变
- }
对应的EPL如下
- // 当Person类型的事件中name为luonanqin时,更新家里的电话
- update Person set phones('home') = 123456789 where name="luonanqin"
Esper对POJO的支持基本上就是上面所说的,另外他还支持实现了多个接口类或者抽象类的POJO,使用方法和普通的POJO没什么区别,这里就不列举了。
2.Map
Esper支持原生Java Map结构的事件。相对于POJO来说,Map的结构更利于事件类型的热加载,毕竟不是class,所以不需要重启JVM。所以如果系统对重启比较敏感,建议使用Map来定义事件的结构。Map的结构很简单,主要分为事件定义名和事件属性列表。我们继续拿Person来讲解
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- public class PersonMap
- {
- public static void main(String[] args)
- {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- // Person定义
- Map<String,Object> person = new HashMap<String,Object>();
- person.put("name", String.class);
- person.put("age", int.class);
- person.put("children", List.class);
- person.put("phones", Map.class);
- // 注册Person到Esper
- admin.getConfiguration().addEventType("Person", person);
- }
- }
如上所示,Map结构的事件需要将属性名作为key,属性的数据类型作为value保存到Map中,然后再通过Esper的接口注册到Esper。其中addEventType的两个参数分别代表事件定义的名称和所定义的结构。
对应的EPL和POJO的没有区别
- // 当Person类型的事件中name为luonanqin时,Esper能得到对应的age,children
- select age,children from Person where name="luonanqin"
Map对于嵌套类的定义比较特别。如果嵌套的类是POJO,那就如上面所示。如果嵌套的还是Map,那么定义方式就需要改变。我们为Person加上Address,示例如下
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- public class PersonMap
- {
- public static void main(String[] args)
- {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- // Address定义
- Map<String, Object> address = new HashMap<String, Object>();
- address.put("road", String.class);
- address.put("street", String.class);
- address.put("houseNo", int.class);
- // Person定义
- Map<String, Object> person = new HashMap<String, Object>();
- person.put("name", String.class);
- person.put("age", int.class);
- person.put("children", List.class);
- person.put("phones", Map.class);
- person.put("address", "Address");
- // 注册Address到Esper
- admin.getConfiguration().addEventType("Address", address);
- // 注册Person到Esper
- admin.getConfiguration().addEventType("Person", person);
- }
- }
如上所示,有两个关键点:
1.Person在定义Address属性时,map的value不是Address.class,而是Address字符串,而这就代表引擎里的Address对应的Map结构定义
2.事件定义注册必须是Address先于Person,因为Person用到了Address,而引擎是根据Address注册时用的名字去查找Address定义的,所以如果名字写错,引擎就找不到Address了
如果Person有多个Address,则以数组方式定义Person的多个Address时,代码又变成下面的样子了
- person.put("addresses", "Address[]");
另外对于Map,Esper只支持增量更新,也就是说只能增加Map中的属性定义,而不能修改或者删除某个属性(实际上属性增多并不影响其处理性能,所以没有删除在我看来也没什么。至于修改,也只能是先注销再注册了)。我们为Person增加一个gender属性,示例如下
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- import com.espertech.esper.client.EventType;
- public class PersonMap
- {
- public static void main(String[] args)
- {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- // Address定义
- Map<String, Object> address = new HashMap<String, Object>();
- address.put("road", String.class);
- address.put("street", String.class);
- address.put("houseNo", int.class);
- // Person定义
- Map<String, Object> person = new HashMap<String, Object>();
- person.put("name", String.class);
- person.put("age", int.class);
- person.put("children", List.class);
- person.put("phones", Map.class);
- person.put("address", "Address");
- // 注册Address到Esper
- admin.getConfiguration().addEventType("Address", address);
- // 注册Person到Esper
- admin.getConfiguration().addEventType("Person", person);
- // 新增一个gender属性
- person.put("gender", int.class);
- admin.getConfiguration().updateMapEventType("Person", person);
- /** 输出结果:
- * Person props: [address, age, name, children, phones, gender]
- */
- EventType event = admin.getConfiguration().getEventType("Person");
- System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));
- }
- }
3.Object Array
对象数组和Map很像,基本没有差别。只是定义方式不一样,Esper同样也只支持增量更新。这里继续用Person为大家做例子
- import java.util.Arrays;
- import java.util.Map;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- import com.espertech.esper.client.EventType;
- public class PersonArray
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- // Address定义
- String[] addressPropNames = { "road", "street", "houseNo" };
- Object[] addressPropTypes = { String.class, String.class, int.class };
- // Child定义
- String[] childPropNames = { "name", "age" };
- Object[] childPropTypes = { String.class, int.class };
- // Person定义
- String[] personPropNames = { "name", "age", "children", "phones", "address" };
- Object[] personPropTypes = { String.class, int.class, "Child[]", Map.class, "Address" };
- // 注册Address到Esper
- admin.getConfiguration().addEventType("Address", addressPropNames, addressPropTypes);
- // 注册Child到Esper
- admin.getConfiguration().addEventType("Child", childPropNames, childPropTypes);
- // 注册Person到Esper
- admin.getConfiguration().addEventType("Person", personPropNames, personPropTypes);
- // 新增一个gender属性
- admin.getConfiguration().updateObjectArrayEventType("Person", new String[] { "gender" }, new Object[] { int.class });
- /** 输出结果:
- * Person props: [name, age, children, phones, address, gender]
- */
- EventType event = admin.getConfiguration().getEventType("Person");
- System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));
- }
- }
上面的例子包含了对象数组这种事件格式的所有特性,我就不多加解释了。
4.XML
待续
Esper学习之二:事件类型的更多相关文章
- C#学习笔记二: C#类型详解
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- esper(2)-事件类型
1.pojo package com.ebc.eventtype.pojo.pojo1; import cn.hutool.core.collection.CollUtil; import com.e ...
- JavaScript学习 - 基础(二) - 基础类型/类型转换
基础类型 - 数字类型(Number) 1.最基本的数据类型 2.不区分整型数值和浮点型数值 3.所有数字采用64位浮点格式存储,相当于Java和C语言中double格式 4.能表示的最大值 +- 1 ...
- Esper学习之四:Context
上周末打球实在太累了,就没来得及更新,只是列了个提纲做做准备,发现Context还是有很多内容的.结果也花了不少时间才写完,所以这篇需要各位慢慢消化,并且最好多写几个例子加深理解. 如果有不了解Esp ...
- Esper学习之十一:EPL语法(七)
上一篇说到了EPL如何访问关系型数据库这种数据源,实际上别的数据源,比如:webservice.分布式缓存.非关系型数据库等等,Esper提供了统一的数据访问接口.然后今天会讲解如何创建另外一种事件类 ...
- Esper学习之三:进程模型
之前对Esper所能处理的事件结构进行了概述,并结合了例子进行讲解,不清楚的同学请看Esper学习之二:事件类型.今天主要为大家解释一下Esper是怎么处理事件的,即Esper的进程模型. 1.Upd ...
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
前言: C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针 ...
- Esper学习之十二:EPL语法(八)
今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...
- python3.4学习笔记(二) 类型判断,异常处理,终止程序
python3.4学习笔记(二) 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 #引入外部模块 import xxx #random模块,randint(开始数,结束数) ...
随机推荐
- Unity GUI(uGUI)使用心得与性能总结
Unity GUI(uGUI)使用心得与性能总结 作者 kingshijie 关注 2015.09.26 15:35 字数 3686 阅读 28031评论 10喜欢 49 背景和目的 小哈接触Unit ...
- SqlServer 数据库引擎优化顾问优化数据库
现在一直在做的项目,数据量相对也不小,开始的时候没有觉得,因为是刚开始,数据量还很小,在程序使用过程中速度还挺快,但是随着数据量的不停的增长,发现程序越来越慢,甚至出现了超时的问题,因此要对程序和数据 ...
- Oracle表明明存在SQL查询数据提示表不存在异常
今天同事遇到一个很奇怪的问题,恢复了一个数据库,表明明存在,用PLSQL和sqlplus都试过了,SQL语句select * from 表名,查询数据,却提示表名不存在异常 然而,使用select * ...
- Java多线程(九)之ReentrantLock与Condition
一.ReentrantLock 类 1.1 什么是reentrantlock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 ...
- windows版mysql配置--my.ini
完整配置如下: # power by phpStudy 2014 www.phpStudy.net 官网下载最新版 [client] port=3306 [mysql] [mysqld] port=3 ...
- Android 监听屏幕唤醒和关闭的广播
今天希望应用程序的服务运行时,可以监听到屏幕的唤醒.继续百度学习法,连同监听闭幕关闭也一同学习了. 此种情况需要动态注册系统广播.在AndroidManifest.xml中静态注册的实际运行中无效. ...
- JSTL XML标签库 使用
推荐博客:http://blog.sina.com.cn/s/blog_4f925fc30101820u.html XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Do ...
- Thinkphp5笔记一:项目部署
系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 笔记分为两大部分,配置篇与数据库篇 一.虚拟主机部署/本地部署 在网站根目录下建立文件index.ph ...
- 【WP8】让TextBox文本支持滑动(Scroll)
通过修改样式让TextBox支持文本滑动 在Silverlight上,TextBox是有文本滚动的功能的,当TextBox的文本过长时,可以进行拖动的,TextBox使用 VerticalScroll ...
- 127使用 TableView 自带的单元格样式实现好友列表,另外在单元格中添加辅助按钮
类似的做法如之前这篇随笔:114自定义UITableViewCell(扩展知识:为UITableViewCell添加动画效果) 相比之下:自定义 UITableViewCell 的内容灵活,可根据需求 ...