2016-11-16 96 views
0

在Azure服務總線中,我希望發送消息失敗,並且沒有定義任何訂閱。我通過將EnableFilteringMessagesBeforePublishing設置爲true來實現此目標,這會引發異常NoMatchingSubscriptionException在發送到Azure服務總線中的主題時DeadLettering BrokeredMessages

現在,在處理這個異常時,我想DeadLetter它。如果我把BrokeredMessage.DeadLetter(),它拋出InvalidOperation與消息「ReceiveContext is null

try 
{ 
    await topicClient.SendAsync(brokeredMessage); 
} 
catch (NoMatchingSubscriptionException ex) 
{ 
    // **throws exception** if message is attempted to move to DeadLetter queue 
    await brokeredMessage.DeadLetterAsync(); 
} 

這意味着,可以將消息DeadLetter'ed只接收其時,而不是在發送。

上述假設是否正確?

在任何情況下,處理失敗消息發送的最佳策略是什麼?發送過程中是否有失敗的消息方式可以在DeadLetter隊列中結束以供以後調查?

謝謝

回答

0

死信隊列(DLQ)與發送消息的隊列相關聯。如果您沒有訂閱(這是一個隊列),那麼也沒有關聯的DLQ。

在問候的策略,你有兩個問題:

  1. 是否有任何用戶?
  2. 如何處理髮送操作失敗的消息?

第一個問題更多的是關於你正在做的假設,而不是那些應用程序不應該繼續。第二個問題是在整個應用程序運行時肯定會發生的事情,您需要決定應採取何種補償措施。

就個人而言,我不一定啓用EnableFilteringMessagesBeforePublishing功能,除非您絕對需要知道沒有發佈者(問題#1)。如果您更關心消息a發送失敗的事實,而不是沒有發佈者,我建議使用自定義代碼來捕獲失敗,並將其作爲用於控制/報告目的的另一類型的消息發送到存在的隊列中肯定的(即你的應用程序確保它存在)。