2017-07-07 167 views
0

如何從死信隊列中讀取消息並將其放回交易範圍內的父隊列中,因爲只有一個頂級實體能夠參與交易?通常情況下,我會使用傳輸隊列將消息從一個隊列移動到另一個隊列作爲原子操作,但我不相信DLQ有傳輸隊列,即使他們這樣做,我也不會遇到處理傳輸的問題排隊DLQ!在交易範圍內重新提交死信隊列消息

我需要以安全的方式執行此重新提交,並且不會在重新提交過程中丟失消息。

回答

0

Azure服務總線不允許重新提交消息。您需要發送帶有更正數據的新消息。對於在DLQ中找到的消息,您可以推遲原始消息,提交副本,如果成功,則使用您最初推遲推送時收到的序列號接收和刪除原始DLQed消息。

類似的事情由ServiceBus360與Deferred DLQ feature實現。

0

雖然這是事實,你不能重新提交DLQ消息,有點調查和反覆試驗後,我發現了以下工作得好:

  1. 克隆使用BrokeredMessage.Clone的DLQ消息()
  2. BrokeredMessage.Properties
  3. 卸下DeadLetterReasonDeadLetterErrorDescription條目在內TransactionScope發送克隆的消息回原始隊列並完成DLQ消息。

下面是一個例子:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
{ 
    // Create new message 
    var resubmittableMessage = originalMessage.Clone(); 

    // Remove dead letter reason and description 
    resubmittableMessage.Properties.Remove("DeadLetterReason"); 
    resubmittableMessage.Properties.Remove("DeadLetterErrorDescription"); 

    // Resend cloned DLQ message and complete original DLQ message 
    await Task.WhenAll(_messageSender.SendAsync(resubmittableMessage), originalMessage.CompleteAsync()); 

    // Complete transaction 
    scope.Complete(); 
}