RabbitMQ C#API基于事件的消息消费

时间:2010-08-10 06:01:24

标签: c# api rabbitmq producer-consumer

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

3 个答案:

答案 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/

上查看

由于 西蒙