使用topic模式,只有一个消费者
消息放入时按顺序放入mq
第一条日志时间Time:1642056522727 假设为消息a
第二条放入mq日志时间Time:1642056522728 假设为消息b
@RabbitListener(containerFactory = "rabbitConfirmListenerContainerFactory",queues = {Constant.XXXXXX},exclusive = true)
public void xxxxListener(@Payload String message,Channel channel,@Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag){
try {
log.info("Timestamp:{},Thread:{} 接收到消息: {}",TimeUtil.getTimeLong(new Date()),Thread.currentThread().getId(),message);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//回复ack
channel.basicAck(deliveryTag, true);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
先接收到消息b的时间和线程id:Timestamp:1642056523004,Thread:23
后接收到消息a的时间和线程id:Timestamp:1642056523009,Thread:23
不是必现,但是偶尔会有几条发生问题。大部分是正确的
尝试了设置监听为单线程且最大线程为1,PrefetchCount设为1,也会出现顺序颠倒的问题。
能够先获取a再获取b
试试生产者确认发送完第一条消息,再发送第二条消息,从生产者端先保证消息能够顺序到达rabbitmq 消费者端一个queue,一个消费者应该是不会乱序的