c# - RabbitMQ 抛出共享队列关闭错误

标签 c# rabbitmq

我们在项目中一直使用RabbitMQ作为消息服务。我们将把消息推送到队列中,消息消费者将接收到消息,并尝试进入数据库。一旦将值输入数据库,我们将向 RabbitMQ 服务器发回肯定确认,否则我们将发送否定确认。

我已将消息使用者创建为 Windows 服务。消息已成功输入并被消息使用者很好地接收(在表中输入)但异常日志为“共享队列已关闭”。

请找到代码块。

 while (true)
        {

            try
            {

                if (!Connection.IsOpen || !Channel.IsOpen)
                {
                  CreateConnection(existConnectionConfig, QueueName);
                  consumer = new QueueingBasicConsumer(Channel);
                 consumerTag=Channel.BasicConsume(QueueName,false,consumer);      
                }

                    BasicDeliverEventArgs e = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                    IBasicProperties props = e.BasicProperties;
                    byte[] body = e.Body;
                   bool ack = onMessageReceived(body);

                    if (ack == true)
                    {
                        Channel.BasicAck(e.DeliveryTag, false);
                    }
                    else
                        Channel.BasicNack(e.DeliveryTag, false, true);

            }
            catch (Exception ex)
            {

                //Logged the exception in text file where i could see the 
                //message as "Shared queue closed"
            }
        }

我也上网过,但无法解决问题。如果有人能够帮助我,那将会很有帮助。

提前致谢, 热带雨林

最佳答案

在回答您的问题时,当我的 Web 客户端由于应用程序池回收或某些其他超出您范围的连接已断开的潜在原因重置连接时,我遇到了同样的问题。您可能需要构建重试机制来应对这种情况。

您可能想看看 MassTransit .我已经将它与 RabbitMQ 一起使用,它通过有效地为 RabbitMQ 提供管理层使事情变得容易得多。 MassTransit 消除了令人头疼的重试机制 - 请参阅 Connection management .它还提供了一个很好的多线程并发消费者配置。

这样做的好处是您的实现更具可移植性 - 如果需求出现,您可以轻松地将内容更改为 MSMQ。

关于c# - RabbitMQ 抛出共享队列关闭错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165067/

相关文章:

c# - 处理全局异常机器人 | iOS

c# - 如果线程正忙于等待,如何调整 Azure 辅助角色规模?

c# - SQLite 的 Entity Framework MigrationSqlGenerator

c# - 如何在 C# 和 TPL 中并行处理事件

c# - 没有订阅者的 RabbitMQ 队列

docker - 如何在 docker-compose 中将 Flower 连接到代理 RabbitMQ

ubuntu - RabbitMQ 未启动 "failed to create dirty scheduler thread 0"

c# - 为什么有时我必须通过引用传递一个类,而有时却不需要?

java - 使用 rabbitmq 客户端 Java API 保证交付

通过 RabbitMQ 进行 Java/Python 通信