10
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 循环,因为我们希望消费者持续监听。如果我想让它甚至基于 ..那就是当新消息到达队列时只有消费者应该使用消息..或任何类似的事件..

4

3 回答 3

9

RabbitMQ.Client.Events.EventingBasicConsumer用于事件消费者而不是阻塞消费者。

于 2010-12-14T20:59:05.427 回答
7

您当前正在阻塞 Consumer.Queue.Dequeue()。如果我正确理解您的问题,您希望异步使用消息。

执行此操作的标准方法是编写您自己的IBasicConsumer(可能通过继承DefaultBasicConsumer)并将其设置为频道的消费者

这样做的问题是您必须非常小心您在 IBasicConsumer.HandleBasicDelivery 中所做的事情。如果您使用任何同步 AMQP 方法,例如 basic.publish,您将获得死锁。如果你做任何需要很长时间的事情,你会遇到一些其他问题。

如果您确实需要同步方法或长时间运行的操作,那么您正在做的是正确的方法。看看订阅;它是一个 IBasicConsumer,它消耗消息并将它们放入队列中。

如果您需要更多帮助,可以向 rabbitmq-discuss 邮件列表提问。

于 2010-08-10T10:02:04.500 回答
4

我遇到了这个问题,找不到答案,所以创建了一个演示项目,让 RabbitMQ 订阅在收到消息时引发 .Net 事件。订阅在自己的线程上运行,让 UI(在我的情况下)可以自由地做这件事。

我将我的项目称为 RabbitEar 很有趣,因为它会侦听来自强大的 RabbitMQ 的消息,我打算与 RabbitMQ 站点共享此消息,因此如果他们认为其有价值,则可以在示例中包含链接/代码。

在http://rabbitears.codeplex.com/上查看

谢谢西蒙

于 2010-11-22T13:15:14.897 回答