2017-02-05 1 views
1

В данный момент я изучаю, как работать с RabbitMQ. Отправка работ. Но получение не работает. Это мой код:RabbitMQ Consumer всегда напрямую отключается (C#)

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); 
     } 

Это скопировано из Учебника. Если я приступаю к применению, потребитель. Шаттл напрямую вызывается, и я получаю:

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

Может ли кто-нибудь мне помочь?

+0

Это консольное приложение? –

ответ

0

channel.BasicConsume неблокирующий вызов, что означает, что он немедленно вернется. Что будет дальше в вашем примере, так это ваш канал и соединение удаляются (из-за инструкции using), и поэтому вы видите немедленное завершение работы. В этом примере вы скопировали этот код, есть Console.ReadLine заявление сразу после channel.BasicConsume. Это предотвращает удаление канала и соединения, пока пользователь не нажмет клавишу на консоли.

+0

Ничего себе, так легко , но как я могу предотвратить соединение из распоряжения без Console.ReadLine? – cproeller

+0

Хорошо, что вы разместите его сами в своем примере. Просто не используйте блок «using». Вместо этого удалите его явно при необходимости (например, если это приложение asp.net - утилизируйте его при завершении работы приложения). – Evk

+1

Хорошо, спасибо. Я новичок в C# и RabbitMQ и никогда не сделаю этого снова :) – cproeller

Смежные вопросы