2009-08-21 187 views
1

我有一個NServiceBus應用程序,由於某些外部事件未發生,可能無法處理給定消息。因爲這個其他事件不是NSB事件,所以我無法正確實施傳說。NServiceBus延遲消息處理

但是,我不是將消息重新排隊(這將導致一個循環,直到發生外部事件),而是將消息封裝在另一條消息(DelayMessage)中,然後排隊。 DelayMessage由不同的服務提取並放置在數據庫中,直到重試間隔到期。此時,延遲服務將消息重新排隊在原始隊列上,以便可以進行另一次嘗試。

但是,如果該外部事件還沒有發生,這可能會發生多次,並且在甚至從不發生的情況下,我想限制消息所需的往返次數。這意味着DelayMessage具有MaxRetries屬性,但延遲服務將原始消息排隊以便重試時會丟失該屬性。

我錯過了什麼其他選項?我很高興接受這個問題有完全不同的解決方案。

回答

4

考慮實施存儲第一條消息的saga,直到第二條消息到達爲止。您可能還希望該傳奇也打開timeout,以便您的過程不會無限期地等待,如果第二條消息丟失或什麼的。

+0

哇自己 - 謝謝!我不能真正使用我不認爲的傳奇。只有一條消息,它在數據庫中需要一些數據才能被處理。實際上我沒有兩條消息可以組合成一個傳奇,數據是由一個傳統存儲過程創建的,我使用NSB添加引用它的其他數據。 – 2009-08-21 23:24:54

+0

然後使用saga中的超時來檢查數據庫中是否有數據 - 它會爲您提供一個簡單的輪詢機制;沒有數據,請求另一個超時。 – 2009-08-23 21:32:42