RabbitMQ C # API Потребление сообщений на основе событий - PullRequest
10 голосов
/ 10 августа 2010
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);
}

Это то, что мы делаем, когда извлекаем сообщение по подписке. Мы используем цикл «цикл», потому что мы хотим, чтобы потребитель постоянно слушал… что если я хочу сделать это даже на основе… то есть, когда приходит новое сообщениев очереди в это время только Потребитель должен потреблять сообщение .. или о любом подобном событии ..

Ответы [ 3 ]

9 голосов
/ 14 декабря 2010

используйте RabbitMQ.Client.Events.EventingBasicConsumer для потребителя событий вместо блокирующего.

7 голосов
/ 10 августа 2010

Вы в настоящее время блокируете Consumer.Queue.Dequeue ().Если я правильно понимаю ваш вопрос, вы хотите асинхронно потреблять сообщения.

Стандартный способ сделать это - написать свой собственный IBasicConsumer (возможно, с помощью подкласса DefaultBasicConsumer ) и устанавливают его в качестве потребителя для канала.

Проблема в том, что вы должны быть очень осторожными в том, что высделать в IBasicConsumer.HandleBasicDelivery.Если вы используете какие-либо синхронные методы AMQP, такие как basic.publish, вы получите взаимоблокировку.Если вы делаете что-то, что занимает много времени, вы столкнетесь с некоторыми другими проблемами.

Если вам нужны синхронные методы или длительные действия, то вы делаете то, что вы делаете правильно.,Взгляните на Подписка ;это IBasicConsumer, который потребляет сообщения и помещает их в очередь для вас.

Если вам нужна дополнительная помощь, вам следует обратиться к списку рассылки rabbitmq-обсуждения.

4 голосов
/ 22 ноября 2010

У меня была эта проблема, и я не смог найти ответ, поэтому создал демонстрационный проект, чтобы подписка RabbitMQ поднимала события .Net при получении сообщения. Подписка выполняется в своем собственном потоке, оставляя пользовательский интерфейс (в mycase) свободным для этого.

Я забавно называю мой проект RabbitEar, так как он прислушивается к сообщениям от могучего RabbitMQ. Я намерен поделиться этим с сайтом RabbitMQ, чтобы, если они считают его полезным, они могли включить ссылку / код в свои примеры.

Проверьте это на http://rabbitears.codeplex.com/

Спасибо Simon

...