转 Esper开发之一
By: rsljdkt
参考:
esper官网:http://esper.codehaus.org/
说明:
本文定位:初学者
本文主要内容:介绍Esper的基本概念和应用背景,Esper的学习步骤。在文章最后,介绍了Esper的”HelloWorld”。
一、CEP和ESP的概念
CEP,:Complex Event Process,复杂事件处理,是一种新兴的基于事件流的技术,它用于处理事件,从事件流中发现复杂的模式。它将系统数据看做不同类型的事件,通过分析事件间的关系,建立不同事件关系序列库,利用过滤、关联、聚合等技术,最终由简单事件产生高级事件或商业流程。
ESP,Event Stream Process,事件流处理,目的是从事件流中获得有用的事件,进而从中获得有用信息。实时OLAP(联机分析处理)和连续查询者两个术语常常和ESP是同义语。
CEP/ESP适合的应用场景包括商业活动监控、群众智能、犯罪预防、系统动态校验实时风险分析、网络攻击、市场趋势分析等等。商业CEP产品厂商有Oracle、IBM等。
二、什么是Esper
Esper官网是这么定义的:”Esper is a component for CEP and ESP applications”,中文意思是:Esper是用于CEP(复杂事件处理)和ESP(事件流处理)应用程序的组件。
Esper是纯Java开源复杂事件和事件流引擎,可以监测事件流,并在特定事件发生时触发某些动作。Esper引擎是为了满足事件进行分析并做出反应等这些应用需求而产生的。这些应用要求实时或者接近实时处理事件(或消息)。这类应用具有高吞吐量、低响应时间和复杂的计算等特点。
Esper引擎的典型应用有:
Ø 业务处理管理和自动化(处理监控,业务活动监控,异常报告,经营智能化等等)
Ø 财务(算法交易,欺诈检查,风险管理)
Ø 网络及应用程序监控(入侵检测,SLA(Service Level Agreement)监控)
Ø 传感器网络应用(RFID 读取,生产线调度和控制,空中交通)
Esper初学者的学习步骤(这是Esper参考手册上推荐的):
1.阅读Esper官网上的tutorials, case studies and solution patterns。
n Tutorial-本篇是 Esper 的教程,主要介绍了(1)什么是Esper,它有什么优点,包括哪些component(2)什么是事件流,什么是复杂事件。(3)什么是 EPL(4)如何开发一个事件驱动的应用(5)如何设计事件(6)事件流分析(7)事件模式匹配(8)如何结合事件流分析与模式匹配
n Quick Start – 本篇主要描述如何快速使用 Esper,包括(1)安装 (2)创建Java事件类,POJO对象作为事件(3)创建一个 Statement (4)添加一个Listener(5)发送事件(6)Esper配置
n Articles and Presentations, 文章和报告,这里列举了某些文章和展示材料,有些sample可以下载,对于学习和熟悉很有帮助
n Solution Patterns,解决方案模式,使用Q&A的模式,对CEP 和 Esper 进行阐述,对于整个 Esper 的背景知识,会有很大帮助
n Short Case Study, 简短的个案研究,以传输监控为例,进行分析,
n Longer Case Study,较大个案研究,多个事件构成一次事务,对此进行分析
n Additional Examples,其它示例,描述了怎么在 JMS, J2EE等环境里使用
n Technology Links,技术链接,一些参考网站的引用
n Documentation,文档,这里有很多文档供下载到本地
n Building Esper,介绍如何使用 Maven 来build Esper
2.阅读参考手册1.1节:CEP和事件流分析简介
3.阅读参考手册第2章:事件表达(介绍了Esper中表达事件的不同方法)
4.阅读参考手册第3章:处理模型(详细了解EPL连续查询的结果)
5.阅读参考手册4.1节:EPL介绍(使用EPL进行事件流处理)
6.阅读参考手册5.1节:事件模式概览
7.阅读参考手册6.1节:概览(使用正则表达式的事件模式)
8.阅读参考手册14.1:例子概览
9.阅读参考手册15章:性能(关于Esper引擎的性能)
三、Quick Start
下载Esper:
esper-4.0.0.zip
本例只需要一下jar包:
核心包:esper-4.0.0.jar
依赖包:antlr-runtime-3.2.jar
cglib-nodep-2.2.jar
commons-logging-1.1.1.jar
log4j-1.2.16.jar
使用Esper的基本步骤:
1.创建一个Event class
2.创建一个class实现UpdateListener接口
3.创建一个Configuration实例
4.通过EPServiceProviderManger获得EPServiceProvider对象
5.通过EPServcieProder和EPL查询语句,创建EPStatement
6.将listener和EPStatement挂钩
7.使用epService.getEPRuntime().sendEvent(event)向引擎发送事件
举个例子:
1.创建一个Event class
- package org.rsljdkt.rsc.esper.event;
- public class OrderEvent {
- public double price;
- public String itemName;
- public OrderEvent() {
- super();
- }
- public OrderEvent(double price, String itemName) {
- super();
- this.price = price;
- this.itemName = itemName;
- }
- public double getPrice() {
- return price;
- }
- public String getItemName() {
- return itemName;
- }
- }
2.创建一个class实现UpdateListener接口
- package org.rsljdkt.rsc.esper.listener;
- import com.espertech.esper.client.EventBean;
- import com.espertech.esper.client.UpdateListener;
- public class OrderListener implements UpdateListener {
- @Override
- public void update(EventBean[] newEvents, EventBean[] oldEvents) {
- EventBean eb = newEvents[0];
- System.out.println(eb.get(“avgPrice”));
- }
- }
其余步骤:
- import org.rsljdkt.rsc.esper.event.OrderEvent;
- import org.rsljdkt.rsc.esper.listener.OrderListener;
- import com.espertech.esper.client.Configuration;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- import com.espertech.esper.client.EPStatement;
- public class Main {
- public static void main(String[] args) {
- //Creating a configuration
- Configuration config= new Configuration();
- config.addEventTypeAutoName(“org.rsljdkt.rsc.esper.event”);//添加包路径,这样在查询表达式中就不需要写类的全路径了
- //Creating a statement
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config);
- //查询最近30秒钟到达的OrderEvent事件平均价格
- String expression = “Select Avg(price) As avgPrice From OrderEvent.win:time(30 sec)”;
- EPStatement statement = epService.getEPAdministrator().createEPL(expression);
- //Adding a listener
- statement.addListener(new OrderListener());
- //Sending events
- for(int i = 0 ; i<10;i++){
- epService.getEPRuntime().sendEvent(new OrderEvent((i+1)*10,“Name”+i));
- }
- }
- }
运行结果:
- 10.0
- 15.0
- 20.0
- 25.0
- 30.0
- 35.0
- 40.0
- 45.0
- 50.0
- 55.0
<!–EndFragment–>