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);
}
这是我们通过订阅检索消息时所做的事情。我们使用While循环,因为我们希望消费者不断地听...如果我想让它甚至基于...那就是当新消息到达队列时那时只有消费者应该消费这个消息......或者任何类似的事件......
答案 0 :(得分:9)
将RabbitMQ.Client.Events.EventingBasicConsumer
用于事件消费者,而不是阻止消费者。
答案 1 :(得分:7)
您目前正在阻止Consumer.Queue.Dequeue()。如果我正确理解您的问题,您希望异步使用消息。
执行此操作的标准方法是为频道编写自己的IBasicConsumer(可能通过子类化DefaultBasicConsumer)和set it as the consumer。
问题在于你必须非常小心你在IBasicConsumer.HandleBasicDelivery中所做的事情。如果您使用任何同步AMQP方法,例如basic.publish,您将获得死锁。如果你做任何需要很长时间的事情,你会遇到其他一些问题。
如果您确实需要同步方法或长时间运行的操作,那么您正在做的是正确的方法。看看Subscription;这是一个消费消息并将它们放在队列中的IBasicConsumer。
如果您需要更多帮助,可以提出一个值得一提的好地方:rabbitmq-discuss邮件列表。
答案 2 :(得分:4)
我遇到了这个问题并且找不到答案所以创建了一个示例项目,让RabbitMQ订阅在收到消息时引发.Net事件。订阅在自己的线程上运行,让UI(在我的情况下)可以自由地执行。
我正在调用我的项目RabbitEar,因为它会侦听来自强大的RabbitMQ的消息 我打算与RabbitMQ网站分享这个,所以如果他们认为它的价值,他们可以在这些例子中包含一个链接/代码。
在http://rabbitears.codeplex.com/
上查看由于 西蒙