Resubmitting a message from dead letter queue - Azure Service Bus

后端 未结 6 1528
太阳男子
太阳男子 2021-01-11 14:30

I have created a service bus queue in Azure and it works well. And if the message is not getting delivered within default try (10 times), it is correctly moving the message

相关标签:
6条回答
  • 2021-01-11 14:40

    It sounds like it could be related to ASB's "duplicate message detection" functionality.

    When you resubmit a message in ServiceBus Explorer it will clone the message and thereby the new message will have the same Id as the original message in the deadletter queue.

    If you have enabled "Requires Duplicate Detection" on the queue/topic and you try to resubmit the message within the "Duplicate Detection History Time Window", then the message will immediately be moved to the deadletter queue again.

    If you want to use Service Bus Explorer to resubmit deadletter messages, then I think that you will have to disable "Requires Duplicate Detection" on the queue/topic.

    0 讨论(0)
  • 2021-01-11 14:46

    Try to remove dead letter reason

    resubmittableMessage.Properties.Remove("DeadLetterReason");
    resubmittableMessage.Properties.Remove("DeadLetterErrorDescription");
    

    full code

    using Microsoft.ServiceBus.Messaging;
    using System.Transactions;
    
    namespace ResubmitDeadQueue
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                var connectionString = "";
                var queueName = "";
    
                var queue = QueueClient.CreateFromConnectionString(connectionString, QueueClient.FormatDeadLetterPath(queueName), ReceiveMode.PeekLock);
    
                BrokeredMessage originalMessage
                    ;
                var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
                do
                {
                    originalMessage = queue.Receive();
                    if (originalMessage != null)
                    {
                        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
                            client.Send(resubmittableMessage);
                            originalMessage.Complete();
    
                            // Complete transaction
                            scope.Complete();
                        }
                    }
                } while (originalMessage != null);
            }
        }
    }
    

    Thanks to some other responses here!

    0 讨论(0)
  • 2021-01-11 14:47

    The Service Bus Explorer tool always creates a clone of the original message when you repair and resubmit a message from the deadletter queue. It could not be any different as by default Service Bus messaging does not provide any message repair and resubmit mechanism. I suggest you to investigate why your message gets ends up in the deadletter queue as well as its clone when you resubmit it. Hope this helps!

    0 讨论(0)
  • 2021-01-11 14:51

    You'd need to send a new message with the same payload. ASB by design doesn't support message resubmission.

    0 讨论(0)
  • 2021-01-11 14:52

    It may be "duplicate message detection" as Peter Berggreen indicated or more likely if you are directly moving the BrokeredMessage from the dead letter queue to the live queue then the DeliveryCount would still be at maximum and it would return to the dead letter queue.

    Pull the BrokeredMessage off the dead letter queue, get the content using GetBody(), create in new BrokeredMessage with that data and send it to the queue. You can do this in a safe manor, by using peek to get the message content off the dead letter queue and then send the new message to the live queue before removing the message from the dead letter queue. That way you won't lose any crucial data if for some reason it fails to write to the live queue.

    With a new BrokeredMessage you should not have an issue with "duplicate message detection" and the DeliveryCount will be reset to zero.

    0 讨论(0)
  • 2021-01-11 14:54

    We had a batch of around 60k messages, which need to be reprocessed from the dead letter queue. Peeking and send the messages back via Service Bus Explorer took around 6 minutes per 1k messages from my machine. I solved the issue by setting a forward rule for DLQ messages to another queue and from there auto forward it to the original queue. This solution took around 30 seconds for all 60k messages.

    0 讨论(0)
提交回复
热议问题