complex-event-processing - 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 last
和output all
。
上面的查询没有按预期工作:在根本没有输出事件的情况下,在all
只输出一个事件的情况下,而不是在前 5 秒块过去后的后续事件。last
first
有什么方法可以实现我想要的吗?我有一种预感,使用时间窗口或者output
是解决它的方法,但到目前为止还没有能够让它工作。
解决方案
原始问题中的第二个查询最终按预期工作。我以前在 Siddhi 4.1.4 上。升级到 Siddhi 5.0.0 后,查询按我的意愿工作。
推荐阅读
- python - 如何从字符串列表中删除字符的所有实例?
- c++ - 如何将度数转换为弧度?
- python - python:Auto-Py-To-Exe 生成的 exe 导致错误“Fatal Error Failed to execute app”
- php - Http 客户端 laravel
- flutter - 解析 pubspec.yaml 中的块映射错误时需要一个密钥
- search - 使用来自另一个单元格的部分字符串搜索谷歌表格中的范围?
- c - C中的printf语句修改
- c# - 静态字段变量初始化器在在线编译器中失败,但在 VS 中有效
- docker - 磁盘空间不足异常 - 基于 docker 容器的 Nexus
- python - 如何使用 Flask + Swagger UI 输入字符串数组?