一、规则引擎是什么
Esper的官网:http://esper.codehaus.org/
参考文档:https://www.cnblogs.com/yudar/tag/esper/
小明历险记:规则引擎Drools教程:http://www.ibloger.net/article/3166.html
二、复杂事件处理 CEP
CEP
即 Complex Event Process,中文意思就是“复杂事件处理”
CEP 的类 SQL 语句,可以理解为处理模型的定义与描述。这是运行在 CEP引擎
中的特殊语句,之所以叫他类SQL,是因为它和SQL确实很像,除了 select
,insert
,delete
,update
,而且也有 avg
,count
等函数。所以对于会SQL的人来说,他的语法结构大致还是能猜出一二的。在Esper中,这个句子叫做 EPL
,即 Event Process Language
。
三、Esper 简单示例
需求:计算 3 个苹果的平均价格。
1、引入依赖包
<dependency> <groupId>com.espertech</groupId> <artifactId>esper</artifactId> <version>7.1.0</version> </dependency>
2、定义事件模型
import lombok.Data; /** * 定义事件模型 */ @Data public class Apple { private int id; private int price; }
3、事件模型监听
/** * 事件模型监听 * * 实现UpdateListener接口,来定义事件的后置处理过程 */ public class AppleListener implements UpdateListener { @Override public void update(EventBean[] newEvents, EventBean[] oldEvents) { if (newEvents != null) { Double avg = (Double) newEvents[0].get("avg(price)"); System.out.println("Apple's average price is " + avg); } } }
4、测试类
public static void main(String[] args) { EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); EPAdministrator admin = epService.getEPAdministrator(); // 指定事件模型 String apple = Apple.class.getName(); // 描述复杂事件 String epl = "select avg(price) from " + apple + ".win:length_batch(3)"; // 添加事后处理 EPStatement state = admin.createEPL(epl); state.addListener(new AppleListener()); EPRuntime runtime = epService.getEPRuntime(); // 模拟事件发生 Apple apple1 = new Apple(); apple1.setId(1); apple1.setPrice(5); runtime.sendEvent(apple1); Apple apple2 = new Apple(); apple2.setId(2); apple2.setPrice(2); runtime.sendEvent(apple2); Apple apple3 = new Apple(); apple3.setId(3); apple3.setPrice(5); runtime.sendEvent(apple3); }
执行结果
Apple's average price is 4.0
5、为了简化代码,可以使用 lambda
表达式方式创建。
// state.addListener(new AppleListener()); state.addListener((newEvents, oldEvents) -> { if (newEvents != null) { Double avg = (Double) newEvents[0].get("avg(price)"); System.out.println("Apple's average price is " + avg); } });
Esper 对事件有特殊的数据结构约定。能处理的事件结构有:POJO
,java.util.Map
,Object Array
,XML
。
接下来第二章介绍,事件类型
未经允许请勿转载:程序喵 » Esper教程 —— Esper 入门介绍(1)