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

Jig*_*eth 10 c# api producer-consumer rabbitmq

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);
}
Run Code Online (Sandbox Code Playgroud)

这是我们通过订阅检索消息时所做的事情.我们使用While循环,因为我们希望消费者不断地听...如果我想让这个甚至基于......那就是当时新消息到达队列的时候只有消费者应该消费消息..或任何类似的事件..

Car*_*erg 9

使用RabbitMQ.Client.Events.EventingBasicConsumer事件消费者而不是阻止消费者.

  • 请注意[EventingBasicConsumer](http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v2.8.1/rabbitmq-dotnet-client-2.8.1-client-htmldoc/html/type-RabbitMQ.Client .Events.EventingBasicConsumer.html)目前被列为实验性的. (3认同)

scv*_*lex 7

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

这样做的标准方法是编写自己的IBasicConsumer(可能通过继承DefaultBasicConsumer)并将其设置为通道的使用者.

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

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

如果您需要更多帮助,那么值得一提的就是rabbitmq-discuss邮件列表.

  • 摘要:不要分享IModel betweenthreads.创建新的连接/模型非常便宜(与调试并发错误的成本相比). (5认同)