c# – RabbitMQ EventBasicConsumer不工作

背景信息

我在RabbitMQ中有一个队列(用于电子邮件),并希望为它构建一个使用者.该队列由另一个.NET应用程序用于向客户发送电子邮件.我希望电子邮件逻辑能够位于.NET应用程序之外,并且还具有RabbitMQ提供的持久性等优点.

问题

.NET应用程序能够将电子邮件发布/推送到队列中,但我很难构建消费者!这是我的消费者代码

// A console app that would be turned into a service via TopShelf
public void Start()
{
  using (_connection = _connectionFactory.CreateConnection())
  {
    using (var model = _connection.CreateModel())
    {
      model.QueueDeclare(_queueName,true,false,null);
      model.BasicQos(0,1,false);

      var consumer = new EventingBasicConsumer(model);
      consumer.Received += (channelModel,ea) =>
      {
        var message = (Email) ea.Body.DeSerialize(typeof(Email));
        Console.WriteLine("----- Email Processed {0} : {1}",message.To,message.Subject);
        model.BasicAck(ea.DeliveryTag,false);
      };
      var consumerTag = model.BasicConsume(_queueName,consumer);
    }
  }
}

上面的代码应该能够从队列中获取消息并处理它们(根据这个official guide),但这不会发生.

解决方法

问题是过早的连接处理.人们通常认为BasicConsume是一个阻塞调用,但事实并非如此.它几乎会立即返回,下一个声明是处理(关闭)频道和连接,这当然会取消您的订阅.所以要修复 – 在私有字段中存储连接和模型,并且只有在完成队列消耗时才处理它们.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...