Siddhi延迟查询

时间:2019-07-09 06:57:45

标签: complex-event-processing siddhi wso2sp

我正在努力理解这个查询:

from heartbeats#window.time(1 hour) insert expired events into delayedStream;

from every e = heartbeats -> e2 = heartbeats[deviceId == e.deviceId]
  or expired = delayedStream[deviceId == e.deviceId]
within 1 hour 10 minutes 
select e.deviceId, e2.deviceId as id2, expired.deviceId as id3
insert into tmpStream;
  • 第一个查询将所有事件延迟1小时。
  • 第二个查询将过滤1小时前发生的所有事件,并且没有发现新的事件。

这可行,但我不理解这一部分:

  

来自每个e =心跳-> e2 =心跳[deviceId == e.deviceId]或过期= delayStream [deviceId == e.deviceId]

查询的第二部分(或expired = ...)检查具有给定deviceId的事件是否在delayStream上。第一部分的目的是什么以及如何结合在一起,使该查询查找超过1小时未发送数据的设备?

1 个答案:

答案 0 :(得分:0)

如果您要检查传感器是否在过去1个小时内未发送读数,则我认为上述查询不正确。我将窗口调整为1分钟,并发送了2个事件,

ByteBuffer decodedBytes = new BASE64Decoder().decodeBufferToByteBuffer(
    new String(base64split2[1].substring(0, base64split2[1].length() - 1))
);
假设事件到达10和10.15,tmpStream的输出将是10.15(第一部分)和11(由于延迟流)。第二次匹配是不正确的,因为根据用例,它必须在11.15处匹配。

但是,如果您想改进查询,则可以针对用例https://siddhi.io/en/v5.0/docs/query-guide/#detecting-non-occurring-events使用Siddhi检测非发生模式功能,它将更加简单