Purge Deferred Messages in Service Bus

This post has been republished via RSS; it originally appeared at: Microsoft Tech Community - Latest Blogs - .

What are Deferred messages:

Deferred messages refer to messages that a queue or subscription client is unable to process at the moment due to certain circumstances. Instead of processing it immediately, the client can defer the retrieval of the message to a later time, while the message remains in the queue or subscription.

 

Message Deferral | Azure Service Bus

 

Unlike dead-letter messages that are stored in a subqueue, deferred messages are kept in the main queue along with other active messages. However, these messages cannot be received using regular receive operations. If an application loses track of a deferred message, it can be discovered by browsing through the messages.

 

The responsibility of retrieving a deferred message lies with its owner, who must remember the sequence number as it is deferred. A receiver can later retrieve the deferred message by using receive methods that require the sequence number as a parameter. For further details about sequence numbers, please refer to Message sequencing and timestamps.

 

However, it can be very difficult or even unfeasible to get each sequence number from the queue/subscription when the entity contains thousands of messages.

 

Here is an example of how you can receive or purge all the deferred messages in the entity.

 

Pre-requisites:

  • Service Bus namespace

  • Already created queue/subscription

  • Service Bus Explorer

 

Using Service Bus Explorer:

  1. Download the “Service Bus Explorer” from:  https://github.com/paolosalvatori/ServiceBusExplorer

  2. Open service bus explorer and click File and connect it.

         

Mohsin1400_7-1681810258488.png

 

    3. From the drop down, select connection string and provide the connection string of the namespace level.

        

Mohsin1400_8-1681810258492.png

 

    4. Once it is successfully connected, you will see Service Bus Explorer shows the count of Active messages as shown below.

 

Mohsin1400_9-1681810258493.png

 

Mohsin1400_13-1681810429814.png

 

 

    5. When we peek through the messages using Service bus explorer we can see the status of the messages as Deferred.

 

Mohsin1400_14-1681810447929.png

 

   6. When you click on Purge messages, you will notice that the application keeps loading and the messages are not purged.

 

Mohsin1400_15-1681810472068.png

 

 

Receive/Delete messages using C# Code:

 

Run the below code which will receive and complete all the messages from the mentioned queue/subscription after changing the status of deferred to active.

 

 

using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Amqp;

class Program
{
    static void Main(string[] args)
    {
        receiveDeferredMessages();
    }
    public static async Task receiveDeferredMessages()
    {
        List<long> sequencenumbers;
        string connectionString = "SAS Key";
        string queueName = "QueueName";

        try
        {
            bool condition = true;
            sequencenumbers = new List<long>();
            await using var client = new ServiceBusClient(connectionString);
            ServiceBusReceiver receiver = client.CreateReceiver(queueName);

            while (condition)
            {
                ServiceBusReceivedMessage peekedMessage = await receiver.PeekMessageAsync();
                if (peekedMessage != null && peekedMessage.State.ToString() == "Deferred")
                {
                    sequencenumbers.Add(peekedMessage.SequenceNumber);
                }
                else
                {
                    condition = false;
                }
            }

            var deferredMessage = await receiver.ReceiveDeferredMessagesAsync(sequencenumbers);

            foreach (var message in deferredMessage)
            {
                await receiver.CompleteMessageAsync(message);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

 

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.