sper是一个Java开发的事件流处理(ESP:Event Stream Processing)和复杂事件处理(CEP:Complex Event Processing)引擎。CEP:是一种实时事件处理并从大量事件数据流中挖掘复杂模式的技术。ESP:是一种从大量事件数据流中过滤,分析有意义的事件,并能够实时取得这些有意义的信息的技术。该引擎可应用于网络入侵探测,SLA监测,RFID读取,航空运输调控,金融方面(风险管理,欺诈探测)等领域。
在esper官网的Quick Start中有一个简单的例子,但是并没有说明如何在eclipse中建立该工程。同时,发现quick start中的例子在新版本esper-4.9.0中有一丁点的问题。我下面将说明如何建立esper_demo的工程,并做简单的解释。
一、建立工程导入依赖包
在eclipse先建立一个java project,然后导入5个必要的依赖jar:esper-4.9.0.jar、antlr-runtime-3.2.jar、cglib-nodep-2.2.jar、commons-logging-1.1.1.jar、log4j-1.2.16.jar,这个几个依赖包都在官网下载来的包中有。
二、代码编写
1、创建Event Class
根据官网上的例子,先在src建立一个package:org.myapp.event,然后在包下新建一个OrderEvent类。
1 package org.myapp.event; 2 3 public class OrderEvent { 4 private String itemName; 5 private double price; 6 7 public OrderEvent(String itemName, double price) { 8 this.itemName = itemName; 9 this.price = price; 10 } 11 12 public String getItemName() { 13 return itemName; 14 } 15 16 public double getPrice() { 17 return price; 18 } 19 }
2、建立MyListener类,添加一个Listner
1 package org.myapp.event; 2 3 import com.espertech.esper.client.EventBean; 4 import com.espertech.esper.client.UpdateListener; 5 6 public class MyListener implements UpdateListener { 7 public void update(EventBean[] newEvents, EventBean[] oldEvents) { 8 EventBean event = newEvents[0]; 9 System.out.println("avg=" + event.get("avg(price)")); 10 } 11 }
3、建立一个main类
1 package org.myapp.event; 2 3 import com.espertech.esper.client.Configuration; 4 import com.espertech.esper.client.EPServiceProvider; 5 import com.espertech.esper.client.EPServiceProviderManager; 6 import com.espertech.esper.client.EPStatement; 7 8 public class test { 9 10 public static void main(String[] args) { 11 12 // EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); 13 // String expression = "select avg(price) from org.myapp.event.OrderEvent.win:time(30 sec)"; 14 // EPStatement statement = epService.getEPAdministrator().createEPL(expression); 15 16 Configuration config = new Configuration(); 17 config.addEventTypeAutoName("org.myapp.event"); 18 EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config); 19 20 String epl = "select avg(price) from OrderEvent.win:time(30 sec)"; 21 EPStatement statement = epService.getEPAdministrator().createEPL(epl); 22 23 MyListener listener = new MyListener(); 24 statement.addListener(listener); 25 26 OrderEvent event = new OrderEvent("shirt", 74.50); 27 epService.getEPRuntime().sendEvent(event); 28 29 } 30 31 }
17行,在官网中应该是config.addEventTypeAutoAlias("org.myapp.event");但是,在eclipse中显示错误,查了Configuration的API后发现并没有这个函数。所以,换成了addEventTypeAutoName,这个函数(将这个package中所有的class作为event导入)。EPServiceProviderManager.getDefaultProvider(config)是否有config这个参数,返回的都是默认的EPServiceProvider(API上这么说,令人诧异)。
这样就可以直接运行了,avg=74.5,这个运行结果恐怕让人一头雾水。我们不妨把26-27替换成如下代码在重新尝试下。
1 for (int i = 0; i < 10; i++) { 2 epService.getEPRuntime().sendEvent(new OrderEvent("Name" + i,(i + 1) * 10)); 3 // Thread.sleep(1000); 4 }
在看下输出结果。是否一目了然了。