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的。

原文地址:https://www.cnblogs.com/yaoyuan2/p/10601598.html