1【短链接】:BasicGet(String queue, Boolean autoAck)
通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息。
隐患:每次获取消息都会创建channel。
优点:最安全的获取方式且性能不算太差。
2【长链接】:
1)、EventingBasicConsumer【订阅式】
使用这种方式消息会全部打入当前消费者中,不管是否启用确认机制。
隐患:①根据消息的长短多少将影响当前消费者的占用资源。
②如果当前消费者挂掉,那么未处理的消息将会丢失。
解决:【QOS + Ack】 服务质量 + 消息确认
即在channel设置好通道使消息一条一条的从队列中打过来,确认一条打一条。
//UInt32 prefetchSize, 每次取的长度 //UInt16 prefetchCount, 每次取几条 //Boolean global 是否对connection通用 channel.BasicQos(0, 1, true); //https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html //使用事件机制获取消息 EventingBasicConsumer consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) => { Console.WriteLine(Encoding.UTF8.GetString(e.Body)); channel.BasicAck(e.DeliveryTag, false); }; channel.BasicConsume("headersQueue", false, consumer);
2)、QueueingBasicConsumer【死循环】【已过时】
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel); channel.BasicConsume("headersQueue", false, consumer); while (true) { var result = consumer.Queue.Dequeue(); if(result != null) { Console.WriteLine(Encoding.UTF8.GetString(result.Body)); channel.BasicAck(result.DeliveryTag, false); } }
出自:https://www.cnblogs.com/fanqisoft/p/10398340.html