2016-11-25 4 views
2

Я работаю над своими первыми шагами с RabbitMQ и задаюсь вопросом, почему это не сработало.RabbitMQ не может отправлять и получать от того же процесса

В базовом учебнике (https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html) имеется один исполняемый файл для отправки брокеру, а другой - для его получения.

Я запустил этот код через одно консольное приложение в Visual Studio и не смог получить никаких сообщений.

Если я беру код «Получить» и помещаю его в отдельное консольное приложение и открываю его, я получаю сообщение (никаких других изменений кода).

Может кто-нибудь объяснить, почему я не могу иметь оба в одном процессе? Я понял, что фабрика соединений будет обрабатывать независимые соединения соответственно независимо от того, был ли это тот же процесс или нет.


Для полноты картины (хотя я сомневаюсь, что это необходимо), вот код, который не работал, пока я не вытащил «приемник» код и поместить его в его собственном консольного приложения:

class Program 
{ 
    static void Main(string[] args) { 

     Receiver.Receive(); 
     Console.WriteLine("receiver set up"); 

     System.Threading.Thread.Sleep(5000); 

     Console.WriteLine("sending..."); 
     Test.Send(); 

     // can also reverse order of send/receive methods, same result 

     Console.ReadKey(); 

    } 
} 


public class Receiver 
{ 
    public static void Receive() { 

     var factory = new ConnectionFactory() { HostName = "localhost" }; 

     using (var connection = factory.CreateConnection()) { 

      using (var channel = connection.CreateModel()) { 

       channel.QueueDeclare("hello", false, false, false, null); 

       var consumer = new EventingBasicConsumer(channel); 
       consumer.Received += (model, ea) => { 

        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        System.Diagnostics.Debug.WriteLine("====================="); 
        System.Diagnostics.Debug.WriteLine(message); 
        System.Diagnostics.Debug.WriteLine("====================="); 

       }; 

       channel.BasicConsume("hello", true, consumer); 

      } 

     } 

    } 

} 

public class Test 
{ 

    public static void Send() { 

     var factory = new ConnectionFactory() { HostName = "localhost" }; 

     using (var connection = factory.CreateConnection()) { 

      using (var channel = connection.CreateModel()) { 

       channel.QueueDeclare("hello", false, false, false, null); 

       string message = "Check it!"; 

       var body = Encoding.UTF8.GetBytes(message); 

       channel.BasicPublish("", "hello", null, body); 

      } 
     } 

    } 

} 

ответ

1

Я думаю, что код имеет проблему. Когда вы отправляете сообщение, тогда соединение приема и канал уже мертвы (Dispose called).

Стандартный код с сайта RabbitMQ:

using(var connection = factory.CreateConnection()) 
    using(var channel = connection.CreateModel()) 
    { 
     channel.QueueDeclare(queue: "hello", 
          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(" [x] Received {0}", message); 
     }; 
     channel.BasicConsume(queue: "hello", 
          noAck: true, 
          consumer: consumer); 

     Console.WriteLine(" Press [enter] to exit."); 
     Console.ReadLine(); 
    } 

connection и channel еще живы, когда клиент получил сообщение.

+0

Вы были правы ... У меня была моя строка Console.ReadKey за пределами используемых блоков для приемника, что фактически означает, что я не поддерживаю соединение открытым (позволяя ему распоряжаться, прежде чем у него будет возможность получить). Извиняюсь за мой предыдущий комментарий, ставя под сомнение ваше предложение. Благодаря! – jleach

+0

@ jdl134679 Я был рад помочь вам =) Темы коварны! –

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