2010-08-10 68 views
9
while (true) 
{ 
    BasicDeliverEventArgs e = (BasicDeliverEventArgs)Consumer.Queue.Dequeue(); 
    IBasicProperties properties = e.BasicProperties; 
    byte[] body = e.Body; 
    Console.WriteLine("Recieved Message : " + Encoding.UTF8.GetString(body)); 
    ch.BasicAck(e.DeliveryTag, false); 
} 

這是我們做什麼,當我們通過subscription..We使用While循環,因爲我們希望消費者聽Continously..what如果我想使這個更是以提取信息..也就是說,當消息到達隊列中時,只有消費者應該消費此消息或任何此類相似事件。的RabbitMQ C#API基於事件的信息消費

+0

您可以使用EventingBasicConsumer嗎? http://www.java2s.com/Open-Source/CSharp/Message/RabbitMQ/RabbitMQ/Client/Events/EventingBasicConsumer.cs.htm – maxfridbe 2011-11-30 16:33:10

+0

另請參閱:http://stackoverflow.com/questions/12499174/rabbitmq- c-sharp-driver-stops-receiving-messages – Babak 2014-09-21 11:45:45

回答

7

您當前正在阻止Consumer.Queue.Dequeue()。如果我正確理解你的問題,你想異步消費消息。

這樣做的標準方法是爲您的頻道編寫您自己的IBasicConsumer(可能通過繼承DefaultBasicConsumer)和set it as the consumer

這樣做的麻煩在於,您必須非常注意您在IBasicConsumer.HandleBasicDelivery中所做的事情。如果使用任何同步AMQP方法(例如basic.publish),則會得到一個死鎖。如果你做了任何需要很長時間的事情,你會遇到一些其他問題。

如果您確實需要同步方法或長時間運行的操作,您正在做的是正確的方法。看看Subscription;它是一個IBasicConsumer,它消耗消息並將它們放在隊列中供你使用。

如果您需要任何幫助,最好的地方是rabbitmq-discuss郵件列表。

+5

總結:不要在線程之間共享IModel。創建新的連接/模型非常便宜(與調試併發錯誤的成本相比)。 – 2010-12-14 21:00:32

+0

根據.net客戶端用戶指南應用程序處理程序可以調用IModel.BasicPublish而不導致死鎖,因爲它們是異步操作。但是從處理程序調用QueueDeclare或BasicCancel將導致死鎖。 – maulik13 2015-03-11 08:37:29

4

我有這個問題,找不到答案,因此創建了一個演示項目,讓RabbitMQ訂閱在收到消息時提升.Net事件。訂閱運行在自己的線程上,讓用戶界面(在mycase中)可以自由地完成任務。

我有趣的打電話給我的項目RabbitEar因爲它偵聽對來自強大的RabbitMQ 我打算這樣,如果他們認爲它的價值,他們可以包括在裏面的例子鏈接/代碼與RabbitMQ的現場分享這個消息。

瞧瞧吧http://rabbitears.codeplex.com/

感謝 西蒙

9

使用RabbitMQ.Client.Events.EventingBasicConsumer的三項賽消費者,而不是一個阻斷一個。

+3

請注意[EventingBasicConsumer](http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v2.8.1/rabbitmq-dotnet-client-2.8.1-client-htmldoc/html/type-RabbitMQ。 Client.Events.EventingBasicConsumer.html)目前被列爲實驗。 – WhiteKnight 2012-04-27 20:51:23

+0

我在我的網站上有一個如何在C#中完成此操作的完整示例。 http://www.jarloo.com/listening-to-rabbitmq-events/ – Kelly 2012-05-24 20:21:08

相關問題