RocketMQMessageListener使用错误问题分析与排查

news2025/1/23 2:08:10

背景

RocketMQ与SpingBoot相结合可以大大降低我们开发的复杂度,但是最近在一个新项目中使用RocketMQMessageListener 监听消息,导致消费者启动失败,提示该消费组已经被创建了,请重新申请一个消费者组。

Caused by: org.apache.rocketmq.client.exception.MQClientException: The consumer group[pomp_pstConsumerGroup] has been created before, specify another name please.

于是更换了一个消费者组,依然提示上面的错误。

问题分析

代码中没有看出有什么异常之处,在Nacos中预制了一个开关,然后控制消费逻辑。

@RocketMQMessageListener(consumerGroup = "pomp_pstConsumerGroup",topic = "pts-topic")
@Component
@RefreshScope
public class PtsAuditConsumer implements RocketMQListener<PtsAuditEvent> {

    @Value("${mq.swtich:false}")
    private boolean isStop;

    @Override
    public void onMessage(PtsAuditEvent event) {
        if(isStop){
            return;
        }
        // 省略业务代码
    }
}

我们在RocketMQ 消费者启动代码中发现,是在DefaultMQPushConsumerImpl类中525行报错,原因是在

第521行注册消费者的时候注册失败了。

image-20230910080955419

于是在registerConsumer中我们看到在执行putIfAbsent的时候出错了,说明消费者组与消费者是一一对应的,导致注册失败了。

image-20230910080857231

但是我在项目中检查,该消费者组与消费者并没有重复出现,那么Spring为什么会提示重复呢?既然提示消费者重复,那么我们在启动消费者的时候指定instanceName名,继承RocketMQPushConsumerLifecycleListener,随机生产一个uuid作为instanceName,这样确保Consumer不会重复。

    @Override
    public void prepareStart(DefaultMQPushConsumer defaultMQPushConsumer) {
        defaultMQPushConsumer.setInstanceName(UUIDUtil.getUUID32());
    }

此时消费者已经启动了,但是我们在RocketMQ的控制台可以看到,该topic下有四个queue,有两个consumerClient均分4个queue。此时又开始疑惑了,命名只启动了一个消费者,为什么会有两个consumerClinet呢?这也就是为什么不指定InstanceName时消费者组重复的根本原因。

image-20230910082429278

于是开始推测,是什么原因导致Spring在启动的时候,该Bean在被创建了两次?最后我们从RocketMQMessageListener加载的代码开始分析问题。

image-20230910085018281

果然在ListenerContainerConfiguration中获取RocketMQMessageListener注解的所有实例,获取到两个,这两个消费者是指向同一个类,其中一个的bean是以scopedTarget开头,那么我们就要寻找在什么地方将beanName代理成了scopedTarget.beanName。

image-20230910092637263

在最终debug下我们发现在ScopedProxyUtils中会将加了@RefreshScope注解的类重新代理了,这就导致我们在注入RocketMQ在启动消费者的时候加载了两次。所有我们最终得出结论,RocketMQMessageListener与RefreshScope注解不能同时使用,可以将RefreshScope作为一个Configuration注入到消费者即可。

思考

1、使用了@RefreshScope + 指定instanceName的方式启动消费者有什么问题?

由于指定了instanceName导致服务中存在两个消费者,如果在Nacos中刷新了配置,则有一个消费者能监听到配置更新,另一个消费者无法监听到配置更新;另一方面频繁的更新配置会触发消费者reblance机制,使得消费性能下降。

2、如果使用了Apollo作为配置中心,是否存在这个问题呢?

Apollo不依赖于RefreshScope 的作用域,所有不加RefreshScope 注解,Apollo也可正常启动,不受影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java并发编程 ConcurrentLinkedQueue详解

文章目录 1 ConcurrentLinkedQueue是什么2 核心属性详解3 核心方法详解3.1 add(E e)3.2 offer(E e)3.3 poll()3.4 size()3.5 并发情况分析 4 总结 1 ConcurrentLinkedQueue是什么 ConcurrentLinkedQueue是一个无界的并发队列&#xff0c;和LinkedBlockingQueue相比&#xff0c…

【新版】系统架构设计师 - 软件架构设计<轻量级架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;轻量级架构&#xff1e;考点摘要轻量级架构表示层业务逻辑层持久层数据库 SSH与SSMHibernate与Mybatis 架构 - 软件架构设计&#xff1c;轻量级架构&#xff1e; 考点摘…

九)Stable Diffussion使用教程:ControlNet

在 ControlNet 出现之前&#xff0c;基于扩散模型的 AI 绘画是极难控制的&#xff0c;因为扩散的过程充满了随机性。 如果只是纯粹自娱自乐&#xff0c;这种随机性并不会带来多大困扰&#xff1b; 但在产业化上应用就难以普及了&#xff0c;因为随机性直接导致的就是缺乏稳定…

【C++漂流记】一文搞懂类与对象中的对象特征

在C中&#xff0c;类与对象是面向对象编程的基本概念。类是一种抽象的数据类型&#xff0c;用于描述对象的属性和行为。而对象则是类的实例&#xff0c;具体化了类的属性和行为。本文将介绍C中类与对象的对象特征&#xff0c;并重点讨论了对象的引用。 文章目录 一、构造函数和…

【云原生进阶之PaaS中间件】第二章Zookeeper-1-综述

1 Zookeeper基础 1.1 简介 ZooKeeper 是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;它包含一个简单的原语集&#xff0c;分布式应用程序可以基于它实现同步服务&#xff0c;配置维护和命名服务等。 Zookeeper是hadoop的一个子项目&#xff0c;其发…

职场工作与生活

序言&#xff1a; 和很多在CSDN的博主一样&#xff0c;大家在工作之后就很少或者是不再回到CSDN&#xff0c;确实自己也一年多没上了。因为可能当初大家在这就是为了记录和分享当初自己学习技术的东西。而大家走出象牙塔开始工作后&#xff0c;发生了很大的转变。在国内…

2核2G3M带宽服务器腾讯云和阿里云价格、性能对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器&#xff0c;腾讯云轻量2核2G3M带宽服务器95元一年&#xff0c;阿里云轻量2核2G3M带宽优惠价108元一年&#xff0c;不只是轻量应用服务器&#xff0c;阿里云还可以选择ECS云服务器u1&#xff0c;腾讯云也可以选择CVM标准型S5云…

堆相关例子-最大线段重合问题

问题描述 给定很多线段&#xff0c;每个线段都有两个数[start, end]&#xff0c; 表示线段开始位置和结束位置&#xff0c;左右都是闭区间 规定&#xff1a; 1&#xff09;线段的开始和结束位置一定都是整数值 2&#xff09;线段重合区域的长度必须>1 返回线段最多重合…

Alibaba(获得店铺的所有商品) API 接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载alibaba API的SDK并掌握基本的API基础知识和调用 4&#xff09;利…

appium+jenkins实例构建

自动化测试平台 Jenkins简介 是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 前面我们已经开完测试脚本&#xff0c;也使用bat 批处…

Linux TCP和UDP协议

目录 TCP协议TCP协议的面向连接1.三次握手2.四次挥手 TCP协议的可靠性1.TCP状态转移——TIME_WAIT 状态TIME_WAIT 状态存在的意义&#xff1a;&#xff08;1&#xff09;可靠的终止TCP连接。&#xff08;2&#xff09;让迟来的TCP报文有足够的时间被识别并被丢弃。 2.应答确认、…

linux 堆探索

堆的虚拟地址是连续的&#xff0c;是brk来分配&#xff0c;brk是一个指针指向堆顶的指针&#xff0c;并且是可以复用的&#xff0c;但是只有在堆顶空闲128k时&#xff0c;才收缩&#xff0c;也就是说&#xff0c;为了减少page_fault&#xff0c;可重用&#xff0c;开销小的特点…

消息队列--入门篇

消息队列–入门篇 目录 消息队列--入门篇如何学习一门新技术&#xff1f;消息队列的组件大体介绍一下producerproducer groupnameSrvbrokerbroker clusterconsumer和consumer groupTopicTag 总结 如何学习一门新技术&#xff1f; 学习任何知识需要有一个整体的认识&#xff0c…

【数据分享】2006-2021年我国省份级别的园林绿化相关指标(多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

【Linux】进程概念I --操作系统概念与冯诺依曼体系结构

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 1. 冯诺依曼体系结构为什么这样设计? 2. 操作系统概念为什么我们需要操作系统呢?操作系统怎么进行管理? 计算机是由两部分组…

使用Xshell远程访问工具连接到Linux

首先需要查看Linux地址&#xff0c;在Linux主界面中右键选择“Open in Terminal” 输入“ifconfig”指令查看IP地址 打开Xshell&#xff0c;输入相关信息&#xff0c;建立连接 点击连接&#xff0c;按照提示输入用户名 root和你自己安装centos7时设置的密码&#xff0c;用…

css实现圆角三角形,圆角三角形的实现

今天给大家带来一个如何实现圆角三角形的方案&#xff0c;这个方案虽然可以实现&#xff0c;但是也是借助拼凑等方式来实现的&#xff0c;假如想一个div来实现圆角三角形&#xff0c;还是比较困难的。之前文章讲了如何实现对话框&#xff0c;里面介绍了三角形的实现方式。今天讲…

使用navicat for mongodb连接mongodb

使用navicat for mongodb连接mongodb 安装navicat for mongodb连接mongodb 安装navicat for mongodb 上文mongodb7.0安装全过程详解我们说过&#xff0c;在安装的时候并没有勾选install mongodb compass 我们使用navicat去进行可视化的数据库管理 navicat for mongodb下载地址…

秒杀“超卖”问题

概述&#xff1a;限时秒杀活动在我们的日常生活中有很多&#xff0c;尤其在“双11”&#xff0c;“618”这类购物节活动中用户的并发数更是海量剧增&#xff0c;那么系统为了防止“超卖”秒杀商品&#xff0c;怎么做才能不影响性能的同时防止超卖。 为了解决“超卖”问题有两种…

mysql或ps提示 vcruntime140_1.dll丢失如何修复,5种方法办法你搞定

今天我在运行一款新安装的软件时&#xff0c;突然遇到了一个让我十分困扰的问题——系统提示vcruntime140_1.dll文件丢失。这个问题导致我无法正常使用这个软件&#xff0c;我也不知道怎么回事&#xff0c;所以我在网上找了一天终于让我找到解决这个问题的方法了&#xff0c;今…