2014-04-08 46 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#客戶端實現中共享。

直到你嚴格線性工作(沒有並行處理),你可以消耗進程並通過相同的通道發佈(當然是相同的連接)。

注意事項對於一個連接打開的多個通道可以在通信方面互相阻塞。只有一個通道可以同時通過連接發送/接收。由於這種嘗試組織連接和渠道,不會在同時發佈和消費期間彼此阻止。

相關問題