• 复杂事件处理——Esper入门(示例程序)


    前面对Esper Quick Start & Tutorial进行了简单描述,希望各位看官能够大致了解what is Esper,甚至对how to work有朦朦胧胧的了解。

    开发一个Esper事件处理程序,非常简单。开发之前只需要引入 esper-version.jar即可。

    下面是一个简单的Esper示例,包括一个事件类(POJO)和一个主运行类。事件类如下:

    public class MyEvent {
        
        private int id;
        private String name;
        
        public MyEvent(int id, String name) {
            this.id = id;
            this.name = name;
        }
        
        public int getId() {
            return id;
        }
        
        public String getName() {
            return name;
        }
        
    }

    主运行类如下:

    import com.espertech.esper.client.Configuration;
    import com.espertech.esper.client.EPAdministrator;
    import com.espertech.esper.client.EPRuntime;
    import com.espertech.esper.client.EPServiceProvider;
    import com.espertech.esper.client.EPServiceProviderManager;
    import com.espertech.esper.client.EPStatement;
    import com.espertech.esper.client.EventBean;
    import com.espertech.esper.client.UpdateListener;
    
    public class HelloEsper {
    
        public static void main(String[] args) {
            
            /* 设置配置信息 */
            Configuration config = new Configuration();
            config.addEventType("myEvent", MyEvent.class); //添加事件类型定义
            
            /* 创建引擎实例 */
            EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider(config);
            
            /* 创建statement的管理接口实例 */
            EPAdministrator admin = provider.getEPAdministrator();
            //admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");
            EPStatement statement = admin.createEPL("select id, name from myEvent"); //创建EPL查询语句实例,功能:查询所有进入的myEvent事件
            statement.addListener(new UpdateListener() { //为statement实例添加监听
                @Override
                public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                    for(EventBean eb : newEvents) {
                        System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
                    }
                }
            });
            
            /* 引擎实例运行接口,负责为引擎实例接收数据并发送给引擎处理 */
            EPRuntime er = provider.getEPRuntime();
            er.sendEvent(new MyEvent(1,"aaa"));  //发送事件
        }
    
    }

    其中,事件类,各个属性必需包括getter-method。getter-method的写法必需符合JAVA BEAN约定规则。如下:

    主运行类,也就是Esper处理程序的开发步骤基本如下:

    1> 创建Configuraiton实例,配置事件类型、plug-in扩展、关系型数据库的访问参数等。

    2> 创建引擎实例EPServiceProvider,可通过加载Configuration获取指定配置的引擎实例;获取引擎实例时,也可以指定引擎实例名——engineURI。可以参考API。

    3> 创建EPAdministrator,用于注册EPL,获取EPStatement实例。

    4> 为EPStatement添加监听或者subscriber,获取引擎处理数据。(在后续的更新中,会比较3种取值方式:监听、subscriber和pull API)

    5> 获取引擎运行接口EPRuntime。发送事件。

    上面的Esper运行主类中,使用到了configuration。在前两篇中有介绍,Configuration一般不是必须的。所以可以通过如下改造,省去Configuration这一步:

    public class HelloEsper {
    
        public static void main(String[] args) {
    //        
    //        /* 设置配置信息 */
    //        Configuration config = new Configuration();
    //        config.addEventType("myEvent", MyEvent.class); //添加事件类型定义
            
            /* 创建引擎实例 */
            EPServiceProvider provider = EPServiceProviderManager.getDefaultProvider();
            
            /* 创建statement的管理接口实例 */
            EPAdministrator admin = provider.getEPAdministrator();
            admin.createEPL("create schema myEvent as com.esper.test.helloesper.MyEvent");//通过create schema语法注册 myEvent事件。
            EPStatement statement = admin.createEPL("select id, name from myEvent"); //创建EPL查询语句实例,功能:查询所有进入的myEvent事件
            statement.addListener(new UpdateListener() { //为statement实例添加监听
                @Override
                public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                    for(EventBean eb : newEvents) {
                        System.out.println("id:"+eb.get("id") + " name:"+eb.get("name"));
                    }
                }
            });
            
            /* 引擎实例运行接口,负责为引擎实例接收数据并发送给引擎处理 */
            EPRuntime er = provider.getEPRuntime();
            er.sendEvent(new MyEvent(1,"aaa"));  //发送事件
        }
    
    }

    Esper虽然支持了这种方式来注册事件,但是,仍然建议使用java class的表示事件类型。

    【总结】:

    Esper事件驱动程序,开发步骤相对来说比较固定,程序实现相对简单,通过几个主要API就能实现复杂事件处理。相对来说,编写满足需要的EPL语句,比较困难,尤其是当模式匹配、事件流或者数据窗口等结合起来使用时。

    后续的更新中会对几个核心的API进行说明。EPL也会拿出几个章节进行单独的介绍。

  • 相关阅读:
    【免费赠书】前端程序员修炼之路:积土而为山,积水而为海
    开源网站流量统计系统Piwik源码分析——后台处理(二)
    开源网站流量统计系统Piwik源码分析——参数统计(一)
    数学思维修炼
    《代码大全》中的变量
    linux dmesg命令参数及用法详解(linux显示开机信息命令)
    dd命令使用详解
    Linux就这个范儿 第10章 生死与共的兄弟
    Linux就这个范儿 第9章 特种文件系统
    Bash中的shopt选项
  • 原文地址:https://www.cnblogs.com/aking1988/p/3282450.html
Copyright © 2020-2023  润新知