RabbitMQ抛出Shared Queue关闭错误

时间:2015-10-16 07:43:18

标签: c# rabbitmq

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

我已将Message Consumer创建为Windows service.Message已成功输入并被消息使用者(表中的Made条目)很好地接收,但是异常日志"共享队列已关闭"。

请找到代码块。

 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"
            }
        }

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

提前致谢, Selva的

1 个答案:

答案 0 :(得分:1)

在回答您的问题时,我遇到了同样的问题,当我的Web客户端由于应用程序池回收而重置连接或者一些其他潜在原因导致连接被删除超出了您的范围。您可能需要构建重试机制来应对此问题。

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

这样可以让您的实施变得更加便携 - 如果需求出现,您可以轻松地将内容更改为MSMQ。