我使用ext_timed_batch
将批量数据聚合到窗口中。它的工作原理,我唯一的问题是如何在处理完所有事件后发出最后一个窗口。拿这个代码:
public static void main(String[] args) {
EPServiceProvider engine = EPServiceProviderManager.getDefaultProvider();
EPRuntime runtime = engine.getEPRuntime();
final EPStatement stmt = engine.getEPAdministrator().createEPL(
"select sum(value) as valueSum " +
"from MyEvent.win:ext_timed_batch(time, 3 msec, 0)");
stmt.addListener((newT, oldT) -> Arrays.stream(newT).forEach(
t -> System.out.println("valueSum=" + t.get("valueSum"))));
runtime.sendEvent(new MyEvent(0, 0));
runtime.sendEvent(new MyEvent(1, 1));
runtime.sendEvent(new MyEvent(2, 2));
runtime.sendEvent(new MyEvent(3, 3));
runtime.sendEvent(new MyEvent(4, 4));
}
MyEvent.java:
public class MyEvent {
public final long time;
public final int value;
public MyEvent(long time, int value) {
this.time = time;
this.value = value;
}
// ... getters
}
这是输出:
valueSum=3
输出只是一个事件,其中包括事件0,1和2中的值(总和为3)。 3&事件的汇总缺少4(它将是valueSum=7
)。如何处理剩下的事件?
engine.getEPAdministrator().stopAllStatements()
Long.MAX_VALUE
时间戳发送伪造的事件:这有效,但是我嵌入了esper引擎并想要一个通用的解决方案。我不知道查询,也没办法伪造一个事件。stmt.safeIterator()
:它不是为此目的,从最后一个窗口返回事件,而不是从未完成的窗口返回事件。runtime.sendEvent(new CurrentTimeEvent(Long.MAX_VALUE))
:无效。它不会影响ext_timed_batch
。使用Long.MAX_VALUE
时间戳发送伪造活动:
runtime.sendEvent(new MyEvent(Long.MAX_VALUE, 0));
这不是我的解决方案,因为我将esper嵌入到另一个应用程序中,我不了解事件的类型和查询(它可能是任何事情,不一定是{{{{ 1}})。
答案 0 :(得分:-1)
你可以使用" stmt.safeIterator()"当你完成处理事件。引擎不知道最后一个事件是什么。另一个选择是发送一个人造的" MyLastEvent"事件并在终止时使用"输出声明一个上下文"。