背景
使用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