语法
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事件,却能触发监听器。