2017-07-01 55 views
0

後也根據從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行爲?因爲我沒有在官方文檔或其他文章中看到這個,所以我對此有點懷疑。在此先感謝,我非常感謝您的幫助。

回答

1

上述文章中解釋的行爲是準確的。這個問題似乎與您的查詢。在您的測試查詢中,您使用的是INSERT INTO full_names,因此只有當前事件纔會發送到該流。但是,加入過期事件的事件將被髮送至流,因爲過期事件。因此,如果您想要獲得那些過期事件,則必須特別使用其輸出事件類別(即INSERT EXPIRED EVENTS INTO full_namesINSERT ALL EVENTS INTO full_names)來提及它。請參閱以下documentation以瞭解有關輸出事件類別的更多信息。

+0

非常感謝。但是這帶來了一些折衷和跟進擔憂。使用'ALL'會導致重複輸出。 'msg1'從'S1'到達,如果在'S2'的窗口中有'msg2'的匹配,它會匹配併發出** joined **事件。然後當它到期時,如果'msg2'仍然在'S2'的窗口中,它將再次匹配**並再次發出** joined **事件。如果**不**,它會發出** msg1'的非匹配**版本,即使它在到達時已經找到匹配。用'UNIDIRECTINOAL'和'窗口大小'調整,可以減少這種重複。 – samser

+0

但不是我們想要的行爲!我需要來自'S1'的每一個事件;如果在S2中匹配它,** joined **事件就足夠了,如果沒有匹配,就直接發送事件。但通過'UNIDIRECTIONAL LEFT OUTER JOIN',來自'S1'的**單**事件總是會導致**兩個**輸出事件。一到達後,一到期後。它可以是「不匹配」和「匹配」,「匹配和不匹配」,「不匹配和不匹配」以及「匹配和匹配」!我想用'EXPIRED EVENTS'這個行爲是可以實現的,但它損害了我們流處理的實時性。 – samser

+0

我能想到的唯一的事情就是在這個級別接受**重複**並嘗試在**下游**中重複刪除!有什麼想法嗎? – samser