【问题标题】:RabbitMQ Can't Send and Receive from same processRabbitMQ 无法从同一进程发送和接收
【发布时间】:2016-11-26 04:11:46
【问题描述】:

我正在完成我使用 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);

            }
        }

    }

}

【问题讨论】:

    标签: c# rabbitmq


    【解决方案1】:

    我认为代码有问题。当您发送消息时,接收连接和通道已经死(Dispose 调用)。

    来自 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 还活着。

    【讨论】:

    • 你是对的......我的 Console.ReadKey 行在接收器的 using 块之外,这实际上意味着我没有保持连接打开(让它在它有机会之前处理掉受到)。对我之前对您的建议提出质疑的评论表示歉意。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多