朱同学KLAE 2022-01-13 15:10 采纳率: 0%
浏览 40

RabbitMq监听队列获取的数据顺序不对

背景

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

  • 写回答

1条回答 默认 最新

  • zhang.yao Java领域新星创作者 2022-01-13 18:47
    关注

    试试生产者确认发送完第一条消息,再发送第二条消息,从生产者端先保证消息能够顺序到达rabbitmq 消费者端一个queue,一个消费者应该是不会乱序的

    评论

报告相同问题?

问题事件

  • 创建了问题 1月13日

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于#flink#的问题:关于docker部署flink集成hadoop的yarn,请教个问题flink启动yarn-session.sh连不上hadoop
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题