後也根據從WSO2網站的article當你從此以下兩個流JOIN事件發生:西提JOIN事件窗口已過期
當從一個流的事件到達插播加入處理器,它與其他流窗口處理器的所有可用事件相匹配。當找到匹配項時,那些匹配的事件將被髮送到查詢投影機以創建輸出事件;同時,原始事件將被添加到窗口處理器,並且它將保持在那裏直到它到期。同樣,當一個事件從其窗口處理器到期時,它會與另一個流處理器的所有可用事件進行匹配;當找到匹配項時,那些匹配的事件將被髮送到查詢投影機以創建輸出過期事件。
基本上,一個事件將與其他流的窗口的事件,當它到達和再次將尋找新比賽時,它的從窗口過期匹配。但這不是我在我設置的測試環境中注意到的行爲。這裏是我的查詢:
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
}
然後新近到達的事件也被存放於該流窗口爲1分鐘:
{
"firstName": "Stephen",
"identifier": 1
}
當1分鐘高達並且該事件被終止,一個新對應因爲它存在於其他流的窗口中:
{
"lastName": "Carell",
"identifier": 1
}
所以基於這樣的文章應該與它新的匹配加盟事件發送以及看起來像:
{
"firstName": "Stephen",
"lastName": "Carell",
"identifier": 1
}
但,這一事件永遠不會到達,流量不表現爲在那篇文章中解釋!
任何想法可能會導致這種情況,或者如果該文章的聲明是準確的並代表WSO2 Siddhi
行爲?因爲我沒有在官方文檔或其他文章中看到這個,所以我對此有點懷疑。在此先感謝,我非常感謝您的幫助。
非常感謝。但是這帶來了一些折衷和跟進擔憂。使用'ALL'會導致重複輸出。 'msg1'從'S1'到達,如果在'S2'的窗口中有'msg2'的匹配,它會匹配併發出** joined **事件。然後當它到期時,如果'msg2'仍然在'S2'的窗口中,它將再次匹配**並再次發出** joined **事件。如果**不**,它會發出** msg1'的非匹配**版本,即使它在到達時已經找到匹配。用'UNIDIRECTINOAL'和'窗口大小'調整,可以減少這種重複。 – samser
但不是我們想要的行爲!我需要來自'S1'的每一個事件;如果在S2中匹配它,** joined **事件就足夠了,如果沒有匹配,就直接發送事件。但通過'UNIDIRECTIONAL LEFT OUTER JOIN',來自'S1'的**單**事件總是會導致**兩個**輸出事件。一到達後,一到期後。它可以是「不匹配」和「匹配」,「匹配和不匹配」,「不匹配和不匹配」以及「匹配和匹配」!我想用'EXPIRED EVENTS'這個行爲是可以實現的,但它損害了我們流處理的實時性。 – samser
我能想到的唯一的事情就是在這個級別接受**重複**並嘗試在**下游**中重複刪除!有什麼想法嗎? – samser