【问题标题】:RabbitMQ EventBasicConsumer not workingRabbitMQ EventBasicConsumer 不工作
【发布时间】:2017-07-03 08:24:47
【问题描述】:

背景信息

我在 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, 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);
    }
  }
}

上面的代码应该能够从队列中抓取消息并处理它们(根据official guide),但这并没有发生。

【问题讨论】:

  • 很多事情都可能出错。你如何发布消息(到哪个交易所)?同样在您当前的代码中 - 在您创建消费者后(BasicConsume 之后)连接将立即关闭,因此您无论如何都无法获得任何消息。不要在开始消费后立即处理您的连接。
  • @Evk 发布者和消费者都针对相同的交换和队列,这一点我很确定。但我认为你对连接处理的看法是正确的,我会解决这个问题,看看它是否有任何作用。
  • @Evk 你是对的,连接的处理是问题,请回复,我会标记为答案:)

标签: c# .net rabbitmq topshelf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您说队列被另一个 .Net 应用程序使用,那是另一个消费者吗?如果那是另一个消费者,那么您能否确认您使用的是哪个交易所?如果您希望多个消费者接收消息,请继续“FanOut”交换

    【讨论】:

    • 原来是@Evk 建议的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多