RabbitMQ在手动模式下,如果没有调用手动的ack方法,那么在等待十五分钟之后,会重新把消息给消费者。
@Component
public class TestQueueReceiver {
@RabbitListener(queues = "TestQueue")
@RabbitHandler
public void handlerTestQueue(Message msg, Channel channel) throws IOException, InterruptedException {
String message = new String(msg.getBody(), StandardCharsets.UTF_8);
System.out.println("message="+message);
Thread.sleep(5000L);
if("0".equals(message)){
throw new RuntimeException("0的消息消费异常");
}
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
System.out.println(message);
}
}
如上处理消息为0时,会抛出异常,手动的消息确认方法就不会被调用。十五分钟后,消费端会排除consumer ack time out,RabbbitMQ会重新把消息发给消费者。