Esper教程 —— Esper 入门介绍(1)

一、规则引擎是什么

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确实很像,除了 selectinsertdeleteupdate,而且也有 avgcount 等函数。所以对于会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 对事件有特殊的数据结构约定。能处理的事件结构有:POJOjava.util.MapObject ArrayXML

接下来第二章介绍,事件类型

未经允许请勿转载:程序喵 » Esper教程 —— Esper 入门介绍(1)

点  赞 (2) 打  赏
分享到: