首页 > 解决方案 > 使用外部窗口时间戳调试 Siddhi 流查询

问题描述

我计划使用历史事件跟踪(存储在 JSON 中,并为每个事件记录我自己的事件时间戳)来调试我刚刚创建的 Siddhi 流查询。我的直播开始于:

从 MyInputEventStream#window.externalTime(my_own_timestamp, 10 min) 选择 some_fields 插入 MyOutpuStream;

我将从痕迹中一一输入我的事件。

假设事件 1 到达指定的 my_own_timestamp = 1528905600000,即太平洋标准时间 6 月 13 日上午 9 点。而事件 2 在 11 分钟后到达,my_own_timestamp = 1528906260000。我相信我会在上午 9:10 在 MyOutpuStream 获得输出,因为time_stamp(e2) - time_stamp(e1) > 10 min,并且e2会在windows过去后触发系统。

现在假定事件 1 到达 my_own_timestamp = 1528905600000,即上午 9:00。但在接下来的 2 小时内不会有任何事件发生。我是否仍然在上午 9:10 获得输出,因为实际上,窗口时间应该在上午 9:10 到期,与下一个事件何时到达无关?但似乎在这种情况下,Siddhi 的内部计时系统将不得不合并我的事件输入的时间戳,然后根据运行 Siddhi 的进程的时钟系统设置事件的到期时间。这个对吗?你能帮忙澄清一下吗?

标签: complex-event-processingwso2cepsiddhiwso2sp

解决方案


您不会在上午 9:10 获得输出。因为如果您使用 externalTime,事件过期逻辑将完全基于您定义的时间戳。并且它会等待一个满足时间差的时间戳大于或等于前一个事件过期。

内部发生的是;

def array previousEvents;

foreach currentEvent in currentEvents (events that are coming in):
    def currentTime = currentEvent.timestamp;
    foreach previousEvent in previousEvents:
        def previousTime = previousEvent.timestamp;
        def timeDiff = previousTime - currentTime + windowLength;
        if (timeDiff <= 0) {
            remove previousEvent from previousEvents;
            set expired timestamp of previousEvent to currentTime;
            expire previousEvent;
        }
    previousEvents.add(currentEvent);

推荐阅读