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