如何从Esper的ext_timed_batch

时间:2017-06-13 08:21:25

标签: esper

我使用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}})。

1 个答案:

答案 0 :(得分:-1)

你可以使用" stmt.safeIterator()"当你完成处理事件。引擎不知道最后一个事件是什么。另一个选择是发送一个人造的" MyLastEvent"事件并在终止时使用"输出声明一个上下文"。