2015-10-16 71 views
3

我们一直在使用RabbitMQ作为项目中的消息传递服务。我们将把消息推入一个队列中,并将在消息使用者处接收消息,并尝试进入数据库。一旦数据输入到数据库中,我们将发送肯定确认返回到服务器,如果不是,我们将发送否定确认。RabbitMQ引发共享队列关闭错误

我已经创建消息消费者作为Windows service.Message已成功进入消息使用者(表中的条目),但异常日志“共享队列已关闭”已被良好接收。

请找到代码块。

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

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

由于提前, 塞尔瓦

+0

这种情况下总共有多少乘客参与? – Paul

回答

1

在回答你的问题,我也经历过同样的问题时,我的Web客户端已连接复位,由于应用程序池回收或连接已断开,其他一些潜在的原因超出你的范围。您可能需要构建一个重试机制来应对此问题。你可能想看看MassTransit。我已经在RabbitMQ中使用了它,通过有效地向RabbitMQ提供管理层,它使事情变得更容易。 MassTransit消除了重试机制的头痛 - 请参阅Connection management。它还提供了一个很好的多线程并发使用者配置。

这有助于实现更加便携的奖励 - 如果需求出现,您可以轻松将事情更改为MSMQ。