【问题标题】:RabbitMQ Consumer always directly shutsdown (C#)RabbitMQ Consumer 总是直接关闭(C#)
【发布时间】:2017-02-05 15:54:41
【问题描述】:

目前我正在学习如何使用 RabbitMQ。 发送作品。但是接收不起作用。这是我的代码:

    var factory = new ConnectionFactory() { HostName = hostName };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: queueName,
                             durable: false,
                             exclusive: false,
                             autoDelete: false,
                             arguments: null);
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine("Recieved: {0}", message);
            };
            consumer.Shutdown += (o, e) =>
            {
                Console.WriteLine("Error with RabbitMQ: {0}", e.Cause);
                createConnection(hostName, queueName);
            };
            channel.BasicConsume(queueName, true, consumer);
        }

这是从教程中复制的。如果我启动应用程序,consumer.Shutdown 被直接调用,我得到:

    {AMQP close-reason, initiated by Application, code=200, text="Goodbye", classId=0, methodId=0, cause=}

谁能帮帮我?

【问题讨论】:

  • 是控制台应用吗?

标签: c# rabbitmq


【解决方案1】:

channel.BasicConsume 是非阻塞调用,这意味着它会立即返回。在您的示例中接下来发生的事情是您的频道和连接正在被处理(因为using 声明),因此您会看到立即关闭。在您复制此代码的示例中,channel.BasicConsume 之后有 Console.ReadLine 语句。这可以防止通道和连接在用户按下控制台中的键之前释放。

【讨论】:

  • 哇,这么简单,但是如何防止连接在没有 Console.ReadLine 的情况下被丢弃?
  • 你自己在你的例子中处理它。只是不要使用“使用”块。相反,在需要时显式处理它(例如,如果那是 asp.net 应用程序 - 在应用程序关闭时处理它)。
  • 好的,谢谢。我是 c# 和 RabbitMQ 的新手,以后再也不会这样做了 :)
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多