在窗口到期后,Siddhi JOIN事件也是如此

时间:2017-07-01 01:18:58

标签: stream wso2 complex-event-processing siddhi

根据来自WSO2网站的article,当您加入来自两个流的事件时,会发生以下情况:

  

当来自一个流的事件到达流内连接处理器时,它将与另一个流的窗口处理器的所有可用事件进行匹配。找到匹配项后,这些匹配的事件将被发送到查询投影仪以创建输出事件;同时,原始事件将被添加到窗口处理器,它将保持在那里直到它过期。类似地,当事件从其窗口处理器到期时,它与另一个流的窗口处理器的所有可用事件匹配;找到匹配项后,会将这些匹配的事件发送到查询投影仪以创建输出过期事件。

基本上,当到达时,活动将与其他流的窗口事件进行匹配,并且当已过期时,将再次查找新匹配从它的窗口。但这不是我在我设置的测试环境中注意到的行为。这是我的疑问:

FROM first_names#window.time(1 min) AS fst
UNIDIRECTIONAL JOIN last_names#window.time(2 min) AS lst
ON fst.identifier == lst.identifier
SELECT
  fst.identifier,
  fst.firstName,
  lst.lastName
INSERT INTO full_names

然后我按照下面列出的顺序将以下事件发布到各自的流中:

{
  "lastName": "Colbert",
  "identifier": 1
}

{
  "firstName": "Stephen",
  "identifier": 1
}

{
  "lastName": "Carell",
  "identifier": 1
}

第二事件到达时,其对应部分已经存在于其他信息流的窗口中,因此它们匹配且已加入事件按预期立即发出:

{
  "firstName": "Stephen",
  "lastName": "Colbert",
  "identifier": 1
}

然后新到的事件会在一分钟窗口中存储:

{
  "firstName": "Stephen",
  "identifier": 1
}

一分钟启动并且此活动已过期时,其他信息流的窗口中会存在新对应

{
  "lastName": "Carell",
  "identifier": 1
}

因此,根据该文章,它应与之匹配,并发送新的已加入事件,如下所示:

{
  "firstName": "Stephen",
  "lastName": "Carell",
  "identifier": 1
}

但是,这个事件永远不会到来,并且流程的行为与该文章中的解释不同!!!

知道可能导致此问题的原因,或者文章的声明是否准确并代表WSO2 Siddhi行为?因为我没有在官方文档或其他文章中看到这一点,所以我对此有点怀疑。在此先感谢,我非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

上述文章中解释的行为是准确的。问题似乎与您的查询有关。在测试查询中,您使用的是INSERT INTO full_names,因此只有当前事件会被发送到流中。但是,与过期事件相关联的事件将作为过期事件发送到流中。因此,如果您想要获取过期事件,则必须使用其输出事件类别(即INSERT EXPIRED EVENTS INTO full_namesINSERT ALL EVENTS INTO full_names)专门提及它。请参阅以下documentation以了解有关输出事件类别的更多信息。