一、规则引擎是什么
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)
程序喵