esper(4-4)-OverLapping Context

语法

create context context_name 
initiated [by] initiating_condition 
terminated [by] terminating_condition

OverLapping和NoOverLapping一样都有两个条件限制,但是区别在于OverLapping的初始条件可以被触发多次,并且只要被触发就会新建一个context,但是当终结条件被触发时,之前建立的所有context都会被销毁。

例子

package com.ebc.OverLappingContext;

import com.espertech.esper.client.*;

/**
 * @author yaoyuan2
 * @date 2019/3/26
 */
public class OverLappingContextTest {
    public static void main(String[] args) {
        EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
        EPAdministrator admin = epService.getEPAdministrator();
        EPRuntime runtime = epService.getEPRuntime();

        String initial = InitialEvent.class.getName();
        String terminate = TerminateEvent.class.getName();
        String some = SomeEvent.class.getName();
        // 以InitialEvent事件作为初始事件,TerminateEvent事件作为终结事件
        String epl1 = "create context OverLapping initiated " + initial + " terminated " + terminate;
        String epl2 = "context OverLapping select context.id from " + initial;
        String epl3 = "context OverLapping select * from " + some;

        admin.createEPL(epl1);
        EPStatement state = admin.createEPL(epl2);
        state.addListener(new OverLappingContextListener());
        EPStatement state1 = admin.createEPL(epl3);
        state1.addListener(new OverLappingContextListener2());

        InitialEvent i = new InitialEvent();
        System.out.println("sendEvent: InitialEvent");
        runtime.sendEvent(i);

        SomeEvent s = new SomeEvent();
        s.setId(2);
        System.out.println("sendEvent: SomeEvent");
        runtime.sendEvent(s);

        InitialEvent i2 = new InitialEvent();
        System.out.println("sendEvent: InitialEvent");
        runtime.sendEvent(i2);

        TerminateEvent t = new TerminateEvent();
        System.out.println("sendEvent: TerminateEvent");
        runtime.sendEvent(t);

        SomeEvent s2 = new SomeEvent();
        s2.setId(4);
        System.out.println("sendEvent: SomeEvent");
        runtime.sendEvent(s2);
    }
}
class InitialEvent{}

class TerminateEvent{}

class SomeEvent
{
    private int id;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }
}
class OverLappingContextListener implements UpdateListener {

    @Override
    public void update(EventBean[] newEvents, EventBean[] oldEvents)
    {
        if (newEvents != null)
        {
            EventBean event = newEvents[0];
            System.out.println("context.id:" + event.get("id") + ", id:" + event.get("id"));
        }
    }
}

class OverLappingContextListener2 implements 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"));
        }
    }
}

输出

sendEvent: InitialEvent
context.id:0, id:0
sendEvent: SomeEvent
Class:com.ebc.OverLappingContext.SomeEvent, id:2
sendEvent: InitialEvent
context.id:1, id:1
context.id:0, id:0
sendEvent: TerminateEvent
sendEvent: SomeEvent

每发送一个InitialEvent,都会新建一个context,以至于context.id=0和1。

当发送TerminateEvent后,再发送SomeEvent监听器也不会被触发了。而再发送InitialEvent事件,却能触发监听器。

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