复杂事件处理——Esper入门(示例程序)
前面对Esper Quick Start & Tutorial进行了简单描述,希望各位看官能够大致了解what is Esper,甚至对how to work有朦朦胧胧的了解。
开发一个Esper事件处理程序,非常简单。开发之前只需要引入 esper-version.jar即可。
下面是一个简单的Esper示例,包括一个事件类(POJO)和一个主运行类。事件类如下:
public class MyEvent {
private int id;
private String name;
public MyEvent(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
主运行类如下:
import com.espertech.esper.client.Configuration;
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; public class HelloEsper { public static void main(String[] args) { /* 设置配置信息 */
Configuration config = new Configuration();
config.addEventType("myEvent", MyEvent.class); //添加事件类型定义 /* 创建引擎实例 */
EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider(config); /* 创建statement的管理接口实例 */
EPAdministrator admin = provider.getEPAdministrator();
//admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");
EPStatement statement = admin.createEPL("select id, name from myEvent"); //创建EPL查询语句实例,功能:查询所有进入的myEvent事件
statement.addListener(new UpdateListener() { //为statement实例添加监听
@Override
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
for(EventBean eb : newEvents) {
System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
}
}
}); /* 引擎实例运行接口,负责为引擎实例接收数据并发送给引擎处理 */
EPRuntime er = provider.getEPRuntime();
er.sendEvent(new MyEvent(1,"aaa")); //发送事件
} }
其中,事件类,各个属性必需包括getter-method。getter-method的写法必需符合JAVA BEAN约定规则。如下:

主运行类,也就是Esper处理程序的开发步骤基本如下:
1> 创建Configuraiton实例,配置事件类型、plug-in扩展、关系型数据库的访问参数等。
2> 创建引擎实例EPServiceProvider,可通过加载Configuration获取指定配置的引擎实例;获取引擎实例时,也可以指定引擎实例名——engineURI。可以参考API。
3> 创建EPAdministrator,用于注册EPL,获取EPStatement实例。
4> 为EPStatement添加监听或者subscriber,获取引擎处理数据。(在后续的更新中,会比较3种取值方式:监听、subscriber和pull API)
5> 获取引擎运行接口EPRuntime。发送事件。
上面的Esper运行主类中,使用到了configuration。在前两篇中有介绍,Configuration一般不是必须的。所以可以通过如下改造,省去Configuration这一步:
public class HelloEsper {
public static void main(String[] args) {
//
// /* 设置配置信息 */
// Configuration config = new Configuration();
// config.addEventType("myEvent", MyEvent.class); //添加事件类型定义
/* 创建引擎实例 */
EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider();
/* 创建statement的管理接口实例 */
EPAdministrator admin = provider.getEPAdministrator();
admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");//通过create schema语法注册 myEvent事件。
EPStatement statement = admin.createEPL("select id, name from myEvent"); //创建EPL查询语句实例,功能:查询所有进入的myEvent事件
statement.addListener(new UpdateListener() { //为statement实例添加监听
@Override
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
for(EventBean eb : newEvents) {
System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
}
}
});
/* 引擎实例运行接口,负责为引擎实例接收数据并发送给引擎处理 */
EPRuntime er = provider.getEPRuntime();
er.sendEvent(new MyEvent(1,"aaa")); //发送事件
}
}
Esper虽然支持了这种方式来注册事件,但是,仍然建议使用java class的表示事件类型。
【总结】:
Esper事件驱动程序,开发步骤相对来说比较固定,程序实现相对简单,通过几个主要API就能实现复杂事件处理。相对来说,编写满足需要的EPL语句,比较困难,尤其是当模式匹配、事件流或者数据窗口等结合起来使用时。
后续的更新中会对几个核心的API进行说明。EPL也会拿出几个章节进行单独的介绍。
复杂事件处理——Esper入门(示例程序)的更多相关文章
- python入门示例程序
该实例是raspi和dsp电机运动控制板的串口uart通信: import serial class SerialHandler(): ''' raspi serial for communicati ...
- Spring Data Redis入门示例:程序配置(五)
单机配置 redis.properties配置 #redis的服务器地址 redis.host=127.0.0.1 #redis的服务端口 redis.port=6379 #客户端超时时间单位是毫秒 ...
- Cesium入门2 - Cesium环境搭建及第一个示例程序
Cesium入门2 - Cesium环境搭建及第一个示例程序 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 验 ...
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
- Maven入门示例(3):自动部署至外部Tomcat
Maven入门示例(3):自动部署至外部Tomcat 博客分类: maven 2012原创 Maven入门示例(3):自动部署至外部Tomcat 上一篇,介绍了如何创建Maven项目以及如何在内 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Spring MVC 入门示例讲解
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- Velocity魔法堂系列一:入门示例
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Node.js入门实例程序
在使用Node.js创建实际“Hello, World!”应用程序之前,让我们看看Node.js的应用程序的部分.Node.js应用程序由以下三个重要组成部分: 导入需要模块: 我们使用require ...
随机推荐
- 吴柄锡 github----MHA helper
https://github.com/wubx http://www.cnblogs.com/kissdb/p/4009620.html
- Qt 学习之路:坐标系统
在经历过实际操作,以及前面一节中我们见到的那个translate()函数之后,我们可以详细了解下 Qt 的坐标系统了.泛泛而谈坐标系统,有时候会觉得枯燥无味,难以理解,好在现在我们已经有了基础. 坐标 ...
- objective c 学习(一)
问题一:我在程序中看到大量的减号.中括号和NS****这种东西,他们是什么玩意儿? 1 减号(或者加号) 减号表示一个函数.或者方法.或者消息的开始,怎么说都行. 比如c#中,一个方法的写法可能是: ...
- css考核点整理(三)-css选择器的使用
css选择器的使用
- python s12 day3
python s12 day3 深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 使用Spring简化JDBC操作数据库
Spring的开发初衷是为了减轻企业级开发的复杂度,其对数据库访问的支持亦如此,使用Spring访问数据库能带来以下好处: 1.1 简化代码 使用原生的JDBC访问数据库,一般总是要执行以下步 ...
- 如何在安卓/data(而不是/data/data)目录下进行文件的读写操作
分析:Android默认是无法直接操作/data目录的,只能读写程序自己的私有目录,也就是/data/data/package name/下,默认只能操作这个目录下的文件,也就是我们想直接读写/dat ...
- Android清单文件AndroidMenifest.xml
1.AndroidMenifes.xml清单文主要结构件结构 所谓主要结构就是每一个清单文件中都必不可少的结构主要是下面三层 第一层.menifest 第二层.application,use-sdk ...
- vim字符串替换
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...
- VS2015升级Update2之后Cordova程序提示:此应用程序无法在此电脑上运行
VS2015在升级到Update2之后,有可能出现如下异常,在运行Cordova项目时提示: 查看输出面板会有乱码错误信息: 出现此问题的原因是在于npm程序损坏了.vs调用的npm程序并不是在nod ...