根据来自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
行为?因为我没有在官方文档或其他文章中看到这一点,所以我对此有点怀疑。在此先感谢,我非常感谢您的帮助。
答案 0 :(得分:1)
上述文章中解释的行为是准确的。问题似乎与您的查询有关。在测试查询中,您使用的是INSERT INTO full_names
,因此只有当前事件会被发送到流中。但是,与过期事件相关联的事件将作为过期事件发送到流中。因此,如果您想要获取过期事件,则必须使用其输出事件类别(即INSERT EXPIRED EVENTS INTO full_names
或INSERT ALL EVENTS INTO full_names
)专门提及它。请参阅以下documentation以了解有关输出事件类别的更多信息。