复杂事件处理引擎—Esper入门
说明:
以下内容,可以参考Esper官方网站《Qucik start & Tutorial 》(顺序做了部分调整)。 PS:因为英语水平有限(大学期间刚过CET4的英语小盲童一枚),翻译很烂(自己都感觉不能直视),描述不清的,可以随时问。一有时间,将给予解释。
1、什么是Esper?
Esper 是一个事件流处理和事件关联的引擎(CEP,complex event processing 复合事件处理)。作为实时事件驱动框架,当事件流中有事件条件发生时,Esper能够触发自定义动作(POJO)。Esper也是为了大量事件关联而设计,当有数百万的事件进来时,用经典的数据库架构来存储所有事件就有点力不从心了。
Esper定制的事件处理语言EPL,允许表达丰富的事件条件、关联性,也可跨越事件窗口,从而最大限度的减少为应对复杂情况而必须建立系统的开发难度。
Esper是轻量级的java内核实现,可以完全嵌入到任何的java进程、javaEE应用服务器或者给予java的ESB(企业服务总线)。Esper可以很快完成传入的大量消息或者事件处理的应用程序的开发工作。
【总结】Esper是一个事件处理和复杂事件关联处理的java内核的轻量级引擎。对于大量事件的处理,能够用最短的时间做出反应,触发相应的操作。另外,为Esper量身定制的事件处理语言——类SQL语言,对于表达事件的条件以及关联关系的处理等非常方便。
2、快速入门
2.1 安装
Esper的运行和安装很容易,从官网下载并解压缩发布的Zip或tar文件即可。只要安装了JVM,便可以运行官网发布的sample。
Esper的核心包是“esper-version.jar”,其运行依赖的jar包,在解压缩后的lib文件夹。
2.2 创建java事件类
Java类是事件表示的不错选择,然而,根据架构需求,也可以选择基于Map或者XML的事件表示。
Order事件的java类表示。一个POJO,如下:
package org.myapp.event;
public class OrderEvent {
private String itemName;
private double price;
public OrderEvent(String itemName, double price) {
this.itemName = itemName;
this.price = price;
}
public String getItemName() {
return itemName;
}
public double getPrice() {
return price;
}
}
2.2 创建Statement
Statement是一个连续性的查询,通过引擎实例进行注册,当新数据到达时,实时地向监听提供结果,或通过iteratorAPI获取statement执行结果。
下面的代码段获取了一个引擎实例,并注册了一个持续查询。该查询返回在过去30秒的所有OrderEvent事件的平均价格:
EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); //获取默认的引擎实例
String expression = "select avg(price) from org.myapp.event.OrderEvent.win:time(30 sec)";
EPStatement statement = epService.getEPAdministrator().createEPL(expression); //注册EPL,获取statement
2.3 添加监听
当statement的结果集发生变化时,引擎会调用监听作为一个或者多个事件的响应。监听类需要实现UpdateListener接口,并在EventBean实例上执行操作:
public class MyListener implements UpdateListener {
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
EventBean event = newEvents[0];
System.out.println("avg=" + event.get("avg(price)"));
}
}
通过对statement添加监听,引擎实例会将statement的运行结果提供给监听程序。添加操作如下:
MyListener listener = new MyListener();
statement.addListener(listener);
2.4 发送事件
运行时(EPRuntime)API接受事件处理。当statement的结果发生改变,引擎会将处理过的事件结果发送给监听。
OrderEvent event = new OrderEvent("shirt", 74.50);
epService.getEPRuntime().sendEvent(event);
2.5 配置(Configuration)
Esper是开箱运行的,基本没有必须需要的配置。除了需要增加statement的可读性,或提供插件扩展和配置关系型数据访问的机会时必需。
一个有用的配置项,指定了采用事件类的java包名。下面是为OrderEvent添加包的声明。
Configuration config = new Configuration();
config.addEventTypeAutoAlias("org.myapp.event"); //该API杂4.9.0中已经取消,可以使用addEventTypeAutoName
EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config);
添加了包的声明之后,就可以在EPL中移除事件类对应的包名。
String epl = "select avg(price) from OrderEvent.win:time(30 sec)";
EPStatement statement = epService.getEPAdministrator().createEPL(epl);
【总结】
开发一个简单的Esper程序,需要了解如下的API:
1> Configuration 引擎配置API,可以配置关系型数据访问的一些必须参数、Virtual Data Window (虚拟数据窗)、插件等。
2> EPServiceProvider,定义Esper服务提供,也就是Esper引擎。通过EPServiceProvierManager.getDefaultProvder()获取默认的引擎实例。
3> EPAdministrator,statement管理接口,管理引擎实例注册的EPL statement。
4> EPStatement 一个EPL语句。通过EPAdministrator.createEPL这一类的API创建。
5> EPRuntime 运行接口,通过EPServceProvider.getEPRuntime获取。其作用是向引擎实例发送事件。
其中Configuration中很多配置无需设置,只有在使用plug-in或者关系型数据访问的时候,必须设置相关参数。
注: 转载请注明出处。谢谢!!
复杂事件处理引擎—Esper入门的更多相关文章
- 复杂事件处理引擎—Esper入门(第二弹)
说明: 以下内容,可以参考Esper官方网站<Qucik start & Tutorial >(顺序做了部分调整). PS:因为英语水平有限(大学期间刚过CET4的英语小盲童一枚) ...
- 复杂事件处理引擎—Esper工作原理
前面对Esper进行了概述,包括事件类型.事件流.事件窗口以及EPL相关内容.当然,上面的知识,对于简单的Esper开发,应该已经足够,能够根据自己业务需求,做出一个满足需要的Esper应用.但是,真 ...
- 复杂事件处理引擎—Esper 处理模型
1.esper的处理模型是持续性的——根据statement中事件流(event stream).视图(views).过滤器(filters)等的选择,esper引擎一旦处理事件数据,就会变更stat ...
- 复杂事件处理引擎—Esper参考(事件部分)
声明:Esper官方未提供中文文档,以后更新的大部分内容,均来自官方文档.本人英语小白一枚,翻译内容仅供参考.有些翻译确实不忍直视,君可略过. (有人可能会说,翻译的不好不如不翻,可能会误人子弟:不过 ...
- 微软TTS语音引擎编程入门
原文链接地址:http://www.jizhuomi.com/software/135.html 我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的Windows ...
- 复杂事件处理——Esper入门(示例程序)
前面对Esper Quick Start & Tutorial进行了简单描述,希望各位看官能够大致了解what is Esper,甚至对how to work有朦朦胧胧的了解. 开发一个Esp ...
- Camunda工作流引擎简单入门
官网:https://camunda.com/ 官方文档:https://docs.camunda.org/get-started/spring-boot/project-setup/ 阅读新体验:h ...
- 模板引擎ejs入门学习
1:利用 NPM 安装 EJS 很简单 npm install ejs 2:安装完成肯定就是使用了 var template = ejs.compile(str, options); template ...
- OLAP了解与OLAP引擎——Mondrian入门
一. OLAP的基本概念 OLAP(On-Line Analysis Processing)在线分析处理是一种共享多维信息的快速分析技术:OLAP利用多维数据库技术使用户从不同角度观察数据:OLAP ...
随机推荐
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
按教程,使用Convention插件进行配置 教程中说只要加入struts2-convention-plugin-2.3.4.1.jar这个jar包就可以使用. 按照这种方法部署后,启动tomcat报 ...
- 通过xslt把xml转换成html
将内容与内容的表现分离,软件界自从成为一个行业以来一直在追求的目标. xml+xslt是典型的数据与表现分离的设计方式.当然,你可以直接转换成HTML,但是如果你要进行整体变化的时候,XML+XSLT ...
- php 中的$argv与$argc
例如 php test.php as a joke print_r($argv); echo $argc; print_r($argv); array_shift($argv); echo $argc ...
- Managing Hierarchical Data in MySQL
Managing Hierarchical Data in MySQL Introduction Most users at one time or another have dealt with h ...
- Jquery 的bind(), live(), delegate(), on()绑定事件方式
1. 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅. bind() 适 ...
- 利用CSS边框合并属性打造table细边框
CSS代码: <style> table{ border-collapse: collapse;/* 边框合并属性 */ width:200px; } th{ border: 1px so ...
- Android开发之扫描附近wifi热点并列表显示
近期项目中用到了wifi模块.今天做一个简单的总结. 參考:http://www.2cto.com/kf/201310/253617.html 1.如何获取wifi对象并进行操作 要操作WIFI设备, ...
- List 去处自定义重复对象方法
list泛型集合去除重复项,对于单一的某个字段非常简单,但是对于一些自定义要求的还需自定义规则.例子代码: /************绑定乘客信息********/ List<RT.Model. ...
- 最小生成树--->NYOJ-38 布线问题
此题是最基础的最小生成树的题目,有两种方法, 一个是prim一个是kruskal算法,前者利用邻接矩阵,后者是利用边集数组 prim算法的思想是:一个点一个点的找, 先找从第一个点到其他点最小的, 把 ...
- 一个中高级PHP工程师所应该具备的能力
很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望给初级或已经达到中级的PHP工程师一些帮助. 一.平静 ...