2016-11-25 47 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(); 
    } 

connectionchannel都还活着,当客户端接收的消息。

+0

你是对的......我的Console.ReadKey线在接收器的使用块之外,这实际上意味着我没有保持连接打开(让它在它有机会接收之前进行处理)。我以前的评论道歉对你的建议提出质疑。谢谢! – jleach

+0

@ jdl134679我很乐意帮助你=)线程是阴险的! –

相关问题