首页 > 解决方案 > Siddhi:模式激活时忽略重复事件

问题描述

我有一个非发生的事件模式来检测是否发生了某种情况,然后在该情况在时间限制内没有改变时提醒我。下面的查询可以描述为“如果用户出现值 1,如果该用户在 5 秒内没有新值,请提醒我”:

define stream inStream(name string, value int);
partition with (name of inStream) 
begin 
    from every in=inStream[ value == 1 ]
    -> not inStream[ not(value == 1) ] for 5 sec
    select in.name, in.value
    insert into outStream;
end;

此查询完全按预期工作:如果我在 5 秒内没有收到不同于 1 的值,则触发查询。当存在值为 1 的重复事件时,就会出现此问题。

如果我{name: "bob", value: 1}每秒发送事件 10 秒,我希望看到查询触发两次,一次在 5 秒,一次在 10 秒。但是现在我看到查询从 5 秒开始每秒触发一次。本质上,查询(按其应有的方式工作)正在为它看到的每个值为 1 的事件启动 5 秒计时器。但是,如果已经有一个计时器正在运行,我希望它不启动该计时器(或至少不输出)。

我试图通过以下查询来解决这个问题(只需添加一个“输出”行):

define stream inStream(name string, value int);
partition with (name of inStream) 
begin 
    from every in=inStream[ value == 1 ]
    -> not inStream[ not(value == 1) ] for 5 sec
    select in.name, in.value
    output first every 5 sec
    insert into outStream;
end;

我也试过output lastoutput all

上面的查询没有按预期工作:在根本没有输出事件的情况下,在all只输出一个事件的情况下,而不是在前 5 秒块过去后的后续事件。lastfirst

有什么方法可以实现我想要的吗?我有一种预感,使用时间窗口或者output是解决它的方法,但到目前为止还没有能够让它工作。

标签: complex-event-processingsiddhi

解决方案


原始问题中的第二个查询最终按预期工作。我以前在 Siddhi 4.1.4 上。升级到 Siddhi 5.0.0 后,查询按我的意愿工作。


推荐阅读