我有一个non-occurring event pattern来检测某个条件是否发生,如果该条件在一定时间内没有变化,请通知我。下面的查询可以描述为“如果某个用户出现值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时,就会出现此问题。
如果我每秒10秒发送一次事件{name: "bob", value: 1}
,我希望查询被触发两次,一次是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 last
和output all
。
以上查询无法正常工作:在all
和last
的情况下,根本没有输出任何事件,在first
的情况下,仅输出了一个事件,而不是经过第一个5秒块之后的后续对象。
有什么方法可以实现我想要的吗?我有一种直觉,即使用时间窗或output
是解决问题的一种方法,但是到目前为止,它尚无法正常工作。
答案 0 :(得分:1)
原始问题中的第二个查询按预期运行。我以前使用的是Siddhi 4.1.4。升级到Siddhi 5.0.0后,查询将按我希望的方式工作。