2017-07-07 11 views
0

デッドレターキューからメッセージを読み取り、トランザクションスコープ内の親キューに戻すにはどうすればよいですか。トランザクション?通常は、アトミック操作としてメッセージをあるキューから別のキューに移動するために転送キューを使用しますが、DLQに転送キューがあるとは思わないし、そうであっても転送を処理する問題はありませんキューDLQ!トランザクションスコープ内のデッドレターキューメッセージの再送信

私はこの再提出を安全に行う必要があり、再提出プロセス中にメッセージを失うリスクはありません。

答えて

0

Azure Service Busではメッセージの再送信を許可していません。修正されたデータで新しいメッセージを送信する必要があります。 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(); 
} 
関連する問題