• 复杂事件处理引擎—Esper入门


    说明:

      以下内容,可以参考Esper官方网站《Qucik start & Tutorial 》(顺序做了部分调整)。 PS:因为英语水平有限(大学期间刚过CET4的英语小盲童一枚),翻译很烂(自己都感觉不能直视),描述不清的,可以随时问。一有时间,将给予解释。

    1、什么是Esper?

    Esper 是一个事件流处理和事件关联的引擎(CEP,complex event processing 复合事件处理)。作为实时事件驱动框架,当事件流中有事件条件发生时,Esper能够触发自定义动作(POJO)。Esper也是为了大量事件关联而设计,当有数百万的事件进来时,用经典的数据库架构来存储所有事件就有点力不从心了。

    Esper定制的事件处理语言EPL,允许表达丰富的事件条件、关联性,也可跨越事件窗口,从而最大限度的减少为应对复杂情况而必须建立系统的开发难度。

    Esper是轻量级的java内核实现,可以完全嵌入到任何的java进程、javaEE应用服务器或者给予javaESB(企业服务总线)。Esper可以很快完成传入的大量消息或者事件处理的应用程序的开发工作。

    【总结】Esper是一个事件处理和复杂事件关联处理的java内核的轻量级引擎。对于大量事件的处理,能够用最短的时间做出反应,触发相应的操作。另外,为Esper量身定制的事件处理语言——类SQL语言,对于表达事件的条件以及关联关系的处理等非常方便。

     

    2、快速入门

    2.1 安装

    Esper的运行和安装很容易,从官网下载并解压缩发布的Ziptar文件即可。只要安装了JVM,便可以运行官网发布的sample。

    Esper的核心包是“esper-version.jar”,其运行依赖的jar包,在解压缩后的lib文件夹。

    2.2 创建java事件类

    Java类是事件表示的不错选择,然而,根据架构需求,也可以选择基于Map或者XML的事件表示。

    Order事件的java类表示。一个POJO,如下:

    package org.myapp.event;
    
    public class OrderEvent {
        private String itemName;
        private double price;
    
        public OrderEvent(String itemName, double price) {
            this.itemName = itemName;
            this.price = price;
        }
    
        public String getItemName() {
            return itemName;
        }
    
        public double getPrice() {
            return price;
        }
    }

    2.2 创建Statement

    Statement是一个连续性的查询,通过引擎实例进行注册,当新数据到达时,实时地向监听提供结果,或通过iteratorAPI获取statement执行结果。

    下面的代码段获取了一个引擎实例,并注册了一个持续查询。该查询返回在过去30秒的所有OrderEvent事件的平均价格:

    EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); //获取默认的引擎实例
    String expression = "select avg(price) from org.myapp.event.OrderEvent.win:time(30 sec)";
    EPStatement statement = epService.getEPAdministrator().createEPL(expression); //注册EPL,获取statement

     

    2.3 添加监听

    当statement的结果集发生变化时,引擎会调用监听作为一个或者多个事件的响应。监听类需要实现UpdateListener接口,并在EventBean实例上执行操作:

    public class MyListener implements UpdateListener {
        public void update(EventBean[] newEvents, EventBean[] oldEvents) {
            EventBean event = newEvents[0];
            System.out.println("avg=" + event.get("avg(price)"));
        }
    }

     

    通过对statement添加监听,引擎实例会将statement的运行结果提供给监听程序。添加操作如下:

    MyListener listener = new MyListener();
    statement.addListener(listener);

    2.4 发送事件

    运行时(EPRuntime)API接受事件处理。当statement的结果发生改变,引擎会将处理过的事件结果发送给监听。

    OrderEvent event = new OrderEvent("shirt", 74.50);
    epService.getEPRuntime().sendEvent(event);

    2.5 配置(Configuration)

    Esper是开箱运行的,基本没有必须需要的配置。除了需要增加statement的可读性,或提供插件扩展和配置关系型数据访问的机会时必需。 

    一个有用的配置项,指定了采用事件类的java包名。下面是为OrderEvent添加包的声明。

    Configuration config = new Configuration();
    config.addEventTypeAutoAlias("org.myapp.event"); //该API杂4.9.0中已经取消,可以使用addEventTypeAutoName
    EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config);

     

    添加了包的声明之后,就可以在EPL中移除事件类对应的包名。

    String epl = "select avg(price) from OrderEvent.win:time(30 sec)";
    EPStatement statement = epService.getEPAdministrator().createEPL(epl);

    【总结】

    开发一个简单的Esper程序,需要了解如下的API

    1> Configuration 引擎配置API,可以配置关系型数据访问的一些必须参数、Virtual Data Window (虚拟数据窗)、插件等。

    2> EPServiceProvider,定义Esper服务提供,也就是Esper引擎。通过EPServiceProvierManager.getDefaultProvder()获取默认的引擎实例。

    3> EPAdministratorstatement管理接口,管理引擎实例注册的EPL statement

    4> EPStatement  一个EPL语句。通过EPAdministrator.createEPL这一类的API创建。

    5> EPRuntime 运行接口,通过EPServceProvider.getEPRuntime获取。其作用是向引擎实例发送事件。

    其中Configuration中很多配置无需设置,只有在使用plug-in或者关系型数据访问的时候,必须设置相关参数。

     

    注: 转载请注明出处。谢谢!!

     

  • 相关阅读:
    LInux 安装 MySQL
    JS BUG 传递数字过大,数据值会变化
    tabs 标签样式
    【异常】IOException parsing XML document from class path resource [xxx.xml]
    云服务器启动tomcat巨慢,很慢
    Linux修改/etc/profile配置错误command is not found自救方法
    linux 安装 vsftpd服务
    为什么说 Vue 的响应式更新比 React 快
    在idea中使用git拉去最新代码并merge到本地代码中
    解决重新打开一个项目,idea需要重新配置maven的问题
  • 原文地址:https://www.cnblogs.com/aking1988/p/Esper-quick-start.html
Copyright © 2020-2023  润新知