使用外部窗口时间戳来调试Siddhi流查询

时间:2018-06-13 22:03:39

标签: complex-event-processing wso2cep siddhi wso2sp

我打算使用历史事件跟踪(存储在JSON中,并为每个事件记录我自己的事件时间戳)来调试我刚刚创建的Siddhi流查询。我的信息流以:

开头 来自MyInputEventStream的

#window.externalTime(my_own_timestamp,10分钟)    选择some_fields    插入MyOutpuStream;

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

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

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

1 个答案:

答案 0 :(得分:0)

上午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);