首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RabbitMQ EventBasicConsumer不工作

RabbitMQ EventBasicConsumer不工作
EN

Stack Overflow用户
提问于 2017-07-03 08:24:47
回答 2查看 4.3K关注 0票数 8

背景信息

我有一个队列(表示电子邮件)在RabbitMQ中,并且希望为它构建一个消费者。这个队列被另一个.NET应用程序用来发送电子邮件给客户。我希望电子邮件逻辑在.NET应用程序之外,也有RabbitMQ提供的耐用性...etc的好处。

问题

该.NET应用程序能够发布/推送电子邮件到队列,但我有困难的建设消费者!这是我给消费者的代码:

代码语言:javascript
复制
// 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, 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, false, consumer);
    }
  }
}

上面的代码应该能够从队列中抓取消息并处理它们(根据这个官方指南),但是这种情况并没有发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-03 14:45:40

问题是过早的连接处理。人们经常认为BasicConsume是一个阻塞调用,但它不是。它将几乎立即返回,下一个语句是处理(关闭)通道和连接,当然,这将取消您的订阅。因此,要在私有字段中修复存储连接和模型,并仅在完成队列消耗时才将它们释放。

票数 18
EN

Stack Overflow用户

发布于 2017-07-03 14:26:31

你说队列是由另一个.Net应用程序使用的,那是另一个消费者吗?如果这是另一位消费者,那么请您确认您使用的是哪一种交换机?如果您想让多个消费者接收到信息,请继续进行"FanOut“交换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44880870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档