rabbitmq消费者瞬间就获全部取队列的消息问题
解决方法:
那是因为消费者可能设置了自动确认,所以消费者获取第一个消息并没处理完业务代码就马上直接获取下一个消息,所以我们可以设置消费者手动确认,也就是把自动确认autoAck设置为false并添加手动确认。
比如下面的 channel.basicConsume第二个参数设置为false就是设置autoAck为false,要 执行channel.basicAck后消费者才会去获取下一个未确认消息。
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("消费者:"+consumerTag+" 接收的消息:" + message );
};
channel.basicQos(1,false);//限制消费者获取未确认消息的数量
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});