.Net Core&RabbitMQ限制循環消費( 四 )


.Net Core&RabbitMQ限制循環消費

文章插圖
設定消費者端第五十條消息會被拒收,且隊列的TTL設置為5秒 。
//死信交換機和死信隊列var dlxExchangeName = "dlx_exchange";channel.ExchangeDeclare(exchange: dlxExchangeName, type: "fanout", durable: false, autoDelete: false, arguments: null);var dlxQueueName = "dlx_queue";channel.QueueDeclare(queue: dlxQueueName, durable: false, exclusive: false, autoDelete: false, arguments: null);channel.QueueBind(queue: dlxQueueName, exchange: dlxExchangeName, routingKey: "");//常規隊列var queueName = "normalmessage_queue";var arguments = new Dictionary<string, object>{    { "x-message-ttl", 5000},    { "x-dead-letter-exchange", dlxExchangeName }};channel.QueueDeclare(queue: queueName, durable: false, exclusive: false, autoDelete: false, arguments: arguments);channel.BasicQos(0, 5, false);var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, ea) =>{    var message = ea.Body;    Console.WriteLine("接收到信息為:" + Encoding.UTF8.GetString(message.ToArray()));    if (Encoding.UTF8.GetString(message.ToArray()).Contains("50"))    {        Console.WriteLine($"拒收 {DateTime.Now}");        ((EventingBasicConsumer)model).Model.BasicReject(ea.DeliveryTag, requeue: true);        return;    }    ((EventingBasicConsumer)model).Model.BasicAck(ea.DeliveryTag, multiple: false);};channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);當消費者端拒收消息后消息重入隊列,再次消費,反復進行超過5秒后 , 消息在隊列中達到了過期時間,則被挪入到死信隊列中 。
.Net Core&amp;RabbitMQ限制循環消費

文章插圖
從Web管理中死信隊列中可查看該條過期的消息 。
.Net Core&amp;RabbitMQ限制循環消費

文章插圖
參考資料
  1. https://www.jianshu.com/p/f77a0b10c140
  2. https://www.jianshu.com/p/4904c609632f
  3. https://stackoverflow.com/questions/23158310/how-do-i-set-a-number-of-retry-attempts-in-rabbitmq
2022-10-29,望技術有成后能回來看見自己的腳步

推薦閱讀