c# - 在C#中的rabbit Mq中获取xDeath中队列消息的最大重试次数

标签 c# rabbitmq dead-letter

我想在 rabbit MQ 中实现 DLX,它设置失败消息的重试次数。如果重试次数大于 5,则消息将被自动丢弃。

下面是 DLX 的片段。

        string WORK_EXCHANGE = "DeadExchange"; // dead letter exchange
        string RETRY_QUEUE = "RetryQueue";
        int RETRY_DELAY = 10000;

        var queueArgs = new Dictionary<string, object> {
            { "x-dead-letter-exchange", WORK_EXCHANGE },
            { "x-message-ttl", RETRY_DELAY }
        };

        var properties = channel.CreateBasicProperties();
        properties.Persistent = true;

        channel.ExchangeDeclare(exchange: WORK_EXCHANGE,
                                type: ExchangeType.Direct);

        channel.QueueBind(queue: queueName, exchange: WORK_EXCHANGE, routingKey: routingKey, arguments: null);

        channel.ExchangeDeclare(exchange: RETRY_EXCHANGE,
                                type: ExchangeType.Direct);

        channel.QueueDeclare(queue: RETRY_QUEUE, durable: true, exclusive: false, autoDelete: false, arguments: queueArgs);
        channel.QueueBind(queue: RETRY_QUEUE, exchange: RETRY_EXCHANGE, routingKey: routingKey, arguments: null);
        channel.BasicPublish(exchange: RETRY_EXCHANGE, routingKey: routingKey, mandatory: true, basicProperties: properties, body: message);

我想读取 x-Death 属性,如下面的队列消息所示。

到目前为止我已经达到了

(BasicDeliveryEventArgs)ea.BasicProperties.Headers["x-death"]

Queue Message Properties

最佳答案

您可以通过这种方式检索计数:

    private long? GetRetryCount(IBasicProperties properties)
    {
        if (properties.Headers.ContainsKey("x-death"))
        {
            var deathProperties = (List<object>)properties.Headers["x-death"];
            var lastRetry = (Dictionary<string, object>)deathProperties[0];
            var count = lastRetry["count"];
            return (long)count;
        }
        else
        {
            return null;
        }
    }

希望对大家有用

关于c# - 在C#中的rabbit Mq中获取xDeath中队列消息的最大重试次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58993088/

相关文章:

azureservicebus - Azure SB 队列将消息发送到禁用的死信队列

c# - 我能否获取消息放入死信/毒药队列的异常或原因?

c# - 当使用参数重定向到另一个操作时,属性变为 NULL

node.js - AMQPlib Nodejs 消费者任务并发

c# - 如何将多个 bool 值声明为 false

django - 如何确保 celery 任务在工作线程上串行运行?

spring - 使用 Spring amqp 库的请求-响应模式

java - RabbitMQ - Apache Camel Reading Messages 如何处理失败的消息

c# - 在 Windows 中使用 WMPLib 在 C# 中控制音量

c# - 将项目添加到 Sitecore 组合框