Navid_pdp11
Navid_pdp11

Reputation: 4012

Set maximum retry count on my message in rabbitmq

I am using EasyNetQ to connect and interact with RabbitMQ. I need to retry the failed message 3 times and then set message as failed item. can we set a retry count on our message from either Sender nor Receiver?

Upvotes: 0

Views: 48

Answers (1)

Shoeb Hasan
Shoeb Hasan

Reputation: 36

You can set a property RetryCount to the Message itself and use it to set, get etc.

Here is how you can do it:

Add a property in the message class:

public class MyMessage
{
    public string Text { get; set; }
    public int RetryCount { get; set; } = 0;
}

Use a constant for setting a retry count:

private const int MaxRetryCount = 3;

Invoking of message processing in the receiver side:

using (var bus = RabbitHutch.CreateBus(rabbitMqConnectionString))
{
    bus.Receive<MyMessage>("myQueue", message => HandleMessage(message, bus));
}

Handling a message in the receiver side:

private static void HandleMessage(MyMessage message, IBus bus)
{
    try
    {
        Console.WriteLine("Processing message: " + message.Text);

        // Process your message here..

        Console.WriteLine("Message processed successfully.");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Message processing failed: " + ex.Message);
        message.RetryCount++;
        if (message.RetryCount <= MaxRetryCount)
        {
            Console.WriteLine($"Retrying message ({message.RetryCount}/{MaxRetryCount})...");
            RetryMessage(message, bus);
        }
        else
        {
            Console.WriteLine("Max retry count reached. Marking message as failed.");
            MarkMessageAsFailed(message);
        }
    }
}   

Sample retry method you could use:

private static void RetryMessage(MyMessage message, IBus bus)
{
    bus.Publish(message);
}

Implement your logic to mark the message as failed. You might move it to a dead letter queue or log it for manual processing.

private static void MarkMessageAsFailed(MyMessage message)
{
    Console.WriteLine("Message marked as failed: " + message.Text);
}    

Upvotes: 1

Related Questions