zoukankan      html  css  js  c++  java
  • esper(4-3)-Non-Overlapping Context

    语法

    create context context_name 
    start start_condition 
    end end_condition

    如:

    // 9点到17点此context才可用(以引擎的时间为准)。如果事件进入的事件不在此范围内,则不受该context影响
    create context NineToFive start (0, 9, *, *, *) end (0, 17, *, *, *)

    例子

    import com.espertech.esper.client.*;
    
    /**
     * @author yaoyuan2
     * @date 2019/3/26
     */
    public class NoOverLappingContextTest {
        public static void main(String[] args) {
            EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
            EPAdministrator admin = epService.getEPAdministrator();
            EPRuntime runtime = epService.getEPRuntime();
    
            String start = StartEvent.class.getName();
            String end = EndEvent.class.getName();
            String other = OtherEvent.class.getName();
            // 以StartEvent事件作为开始条件,EndEvent事件作为结束条件
            String epl1 = "create context NoOverLapping start " + start + " end " + end;
            String epl2 = "context NoOverLapping select * from " + other;
    
            admin.createEPL(epl1);
            EPStatement state = admin.createEPL(epl2);
            state.addListener(new UpdateListener() {
                @Override
                public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                    if (newEvents != null) {
                        EventBean event = newEvents[0];
                        System.out.println("Class:" + event.getUnderlying().getClass().getName() + ", id:" + event.get("id"));
    
                    }
                }
            });
    
            StartEvent s = new StartEvent();
            System.out.println("sendEvent: StartEvent");
            runtime.sendEvent(s);
    
            OtherEvent o = new OtherEvent();
            o.setId(2);
            System.out.println("sendEvent: OtherEvent");
            runtime.sendEvent(o);
    
            EndEvent e = new EndEvent();
            System.out.println("sendEvent: EndEvent");
            runtime.sendEvent(e);
    
            OtherEvent o2 = new OtherEvent();
            o2.setId(4);
            System.out.println("sendEvent: OtherEvent");
            runtime.sendEvent(o2);
        }
    }
    class StartEvent
    {
    }
    
    class EndEvent
    {
    }
    class OtherEvent
    {
        private int id;
    
        public int getId()
        {
            return id;
        }
    
        public void setId(int id)
        {
            this.id = id;
        }
    }

    输出

    sendEvent: StartEvent
    sendEvent: OtherEvent
    Class:com.ebc.NoOverLappingContext.OtherEvent, id:2
    sendEvent: EndEvent
    sendEvent: OtherEvent

    由此看出,在NoOverLapping这个Context下监控OtherEvent,必须是在StartEvent被触发才能监控到,所以在EndEvent发送后,再发送一个OtherEvent是不会触发Listener的。

  • 相关阅读:
    面向对象之继承
    面向对象之封装
    面向对象编程
    Centos7.7镜像源配置
    Centos7环境配置
    多表查询v1
    多表查询
    库相关操作
    数据库初识
    数据相关操作
  • 原文地址:https://www.cnblogs.com/yaoyuan2/p/10601598.html
Copyright © 2011-2022 走看看