2014-04-08 36 views
0

我可以创建一个连接来侦听队列并将消息发送到另一个交换机吗? 目前,如果我使用一个连接进行发送,我的客户会收到它,但它甚至不会被绑定到此交换。RabbitMQ在一个连接内发送和使用消息

也许,一些设置应该改变?

+1

对不起,但我不明白你的问题。你是说你发送消息给交换机,并且它是在没有绑定的队列上收到的?如果是这样,你能显示交换和队列的配置,以及你用来发送消息的代码吗? –

回答

1

是的, 你可以使用相同的连接,但你必须使用两个通道。

在这里阅读:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

例如:

using (var channel = myConnection.CreateModel()) 
       { 
        channel.QueueDeclare("hello", false, false, false, null); 

        var consumer = new QueueingBasicConsumer(channel); 
        channel.BasicConsume("", true, consumer); 

,并用相同的连接...

using (var channel = myConnection.CreateModel()) 
       { 
       channel.QueueDeclare("hello", false, false, false, null); 
        string message = "Hello World!"; 
        var body = Encoding.UTF8.GetBytes(message); 

        channel.BasicPublish("", "", null, body); 
        Console.WriteLine(" [x] Sent {0}", message); 
       } 

请注意: C#的渠道是不是多线程所以你应该为线程创建一个。

+0

非常感谢。我意识到你甚至不必为接收者和消费者使用2个不同的频道。你可以为他们两个使用一个。 – Alex

+1

欢迎您,是的你可以使用相同的频道,但要小心c#中的频道不要多线程,请阅读: http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/ v3.3.0/rabbitmq-dotnet-client-3.3.0-user-guide.pdf(“线程之间不应该共享IModel”部分) Connection和Channel之间有很大的区别。 – Gabriele

1

是的,当然可以。

  • 在RabbitMQ的,你想保持连接(至少一个)作为开放 只要有可能,由于开放每次各一个和 对性能的影响,它在线程C#的安全。

  • 对面。通道意味着为每个线程打开 ,并且不能在C#客户端实现中共享。

直到你严格线性工作(没有并行处理),你可以消耗进程并通过相同的通道发布(当然是相同的连接)。

注意事项对于一个连接打开的多个通道可以在通信方面互相阻塞。只有一个通道可以同时通过连接发送/接收。由于这种尝试组织连接和渠道,不会在同时发布和消费期间彼此阻止。

相关问题