RocketMq 同组消费者 自动设置InstanceName

news2024/11/16 17:58:09

RocketMq 同组消费者 自动设置InstanceName

  • 一、背景
  • 二、处理方法
  • 三、源码分析
  • 四、总结

一、背景

同组多于1个消费者,如果没单独设置instanceName,默认为DEFAULT。启动时会报如下错误:
org.apache.rocketmq.client.exception.MQClientException: The consumer group[group_03] has been created before, specify another name please.

二、处理方法

创建MqBeanPost,利用后置处理器获取到想要设置的bean,把instanceName设置成随机数。

@Component
public class MqBeanPost implements BeanPostProcessor {
    @Autowired
    MqJudgePacsConfig mqJudgePacsConfig;
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(bean instanceof DefaultRocketMQListenerContainer){
            DefaultRocketMQListenerContainer container = (DefaultRocketMQListenerContainer) bean;
            String topic = container.getTopic();
            if(topic.equals(mqJudgePacsConfig.getTopic())){
                DefaultMQPushConsumer consumer =   container.getConsumer();
                consumer.setInstanceName(UUID.fastUUID().toString());
            }
        }
        return bean;
    }
}

三、源码分析

一、springboot整合rocketmq启动流程:
(1)SpringBootApplication
(2)@EnableAutoConfiguration
(3)AutoConfigurationImportSelector实现了ImportSelector 接口,所以执行selectImports方法
->getAutoConfigurationEntry
->getCandidateConfigurations
->SpringFactoriesLoader.loadFactoryNames
->loadSpringFactories此方法会读取所有META-INF/spring.factories文件,转成Map<String, List>,最后getOrDefault(factoryTypeName, Collections.emptyList())获取key 为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值为需要加载到容器类的全类名的集合。
(4)rocketmq和springboot整合jar中spring.factories位置。
在这里插入图片描述
(5)RocketMQAutoConfiguration中@import注入ListenerContainerConfiguration。
ListenerContainerConfiguration 实现了SmartInitializingSingleton类所以当spring容器创建ListenerContainerConfiguration是会进入afterSingletonsInstantiated方法。
(6)此方法中,获取带有RocketMQMessageListener注解类的集合,遍历执行registerContainer。
public void afterSingletonsInstantiated() {
Map<String, Object> beans = this.applicationContext.getBeansWithAnnotation(RocketMQMessageListener.class)
.entrySet().stream().filter(entry -> !ScopedProxyUtils.isScopedTarget(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
beans.forEach(this::registerContainer);
}
(7)重点分析一下画红的代码。createRocketMQListenerContainer方法是获取注解中的属性,创建出DefaultRocketMQListenerContainer对象。最后注册到容器。
在这里插入图片描述
(8)DefaultRocketMQListenerContainer container = genericApplicationContext.getBean(containerBeanName,
DefaultRocketMQListenerContainer.class);
spring容器创建DefaultRocketMQListenerContainer对象。创建对象的流程不在赘述(可以翻看我以前博客创建对象流程)。主要分析后置处理器。使用后置处理器来处理instanceName。
在这里插入图片描述
(9)invokeInitMethods方法中,执行afterPropertiesSet初始化方法。invokeInitMethods方法执行前会调用applyBeanPostProcessorsBeforeInitialization,方法执行后会调用applyBeanPostProcessorsAfterInitialization。
在这里插入图片描述
(10)DefaultRocketMQListenerContainer 实现了InitializingBean所以在执行初始化方法时,调用afterPropertiesSet,然后继续调用initRocketMQPushConsumer
(11)initRocketMQPushConsumer 方法会创建DefaultMQPushConsumer对象,默认的instanceName就是在此创建。所以如果想给DefaultMQPushConsumer设置instanceName,就可以在applyBeanPostProcessorsAfterInitialization中设置。为何不能在applyBeanPostProcessorsBeforeInitialization执行的时候,因为DefaultMQPushConsumer还未创建。
在这里插入图片描述
(12)拓展:initRocketMQPushConsumer 中画红的地方。如果消费端实现了RocketMQPushConsumerLifecycleListener或RocketMQPushConsumerLifecycleListener类的话,可以重写prepareStart方法。在prepareStart方法中设置instanceName。但是这种方法如果有多个消费端的话,要写多次。
在这里插入图片描述

四、总结

此方法的切入点是DefaultRocketMQListenerContainer类创建过程中,使用后置处理器设置instanceName。

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

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

相关文章

物联网工业触摸屏与防火墙的安全协作

1 前言 随着物联网技术的快速发展&#xff0c;物联网HMI不仅需要提供SCADA级功能库和控件库&#xff08;点击查看物联网HMI功能库和控件库的详细介绍&#xff09;&#xff0c;还需要具备强大的安全性能。虹科物联网HMI内置防火墙功能&#xff0c;识别和阻止未经授权的访问&…

PCI Express --- LTSSM

目录 1. 链路训练和状态机 1.1 Detect 状态 1.1.1 Detect.Quiet 子状态 1.1.2 Detect.Active 子状态 1.2 Polling 状态 1.2.1 Polling.Active 子状态 1.2.2 Polling.Compliance 子状态 1.2.2 Polling.Configuration 子状态 1.2.3 Polling.Speed 子状态 1.3 Configuration 状…

性能测试超细总结,如何才能做到有效压测?性能压测看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 目标制定以及业务…

java SSM 游戏资讯系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 游戏资讯系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B…

3ds Max - Pivot Painter Tool

很久之前的笔记&#xff0c;整理归档&#xff1b; Pivot Painter Tool是3dsMax中的插件&#xff0c;主要是辅助将Mesh中每个Element生成自己的Pivot Position&#xff0c;方便如使用World Position Offset对每个Element进行精确控制&#xff0c;导入使用Pivot Painter Tool工具…

深入理解Linux虚拟内存管理(七)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理&#xff08;一&#xff09; 深入理解Linux虚拟内存管理&#xff08;二&#xff09; 深入理解Linux虚拟内存管理&#xff08;三&#xff09; 深入理…

Linux系统和Windows系统下Python2代码转换为Python3代码工具使用指南

简介 本文主要介绍Linux系统和Windows系统下Python2代码转换为Python3代码工具2to3.py或2to3指令使用指南。 项目场景及问题描述 Python2的最后一个版本是2.7&#xff0c;在2020年彻底停止支持。有些环境不方便同时安装Python2和Python3&#xff0c;或者在使用Python3的环境…

【JVM】JVM 垃圾回收算法

文章目录 前言标记清除&#xff08;Mark-Sweep&#xff09;介绍优缺点 复制&#xff08;拷贝 Copying&#xff09;介绍优缺点 标记整理&#xff08;Mark-Compact&#xff09;介绍优缺点 前言 目前JVM中有三种常见的垃圾回收算法&#xff0c;分别是&#xff1a;标记清除、标记整…

Matter实战系列-----1.软硬件开发环境搭建

一、硬件方面 我使用的是一套xG21 BRD4180B和两块xG24 BRD4187C,如下图&#xff1a; 1.1 RCP&#xff1a; 芯片型号EFR32MG21A020F1024IM32 1.2 Matter Light/Switch over Thread&#xff1a; 芯片型号EFR32MG24B220F1536IM48 1.3 蓝牙5.0 USB dongle 注意由于Linux对蓝牙…

阿里、字节、网易面试必考,黑马【爆火】微服务项目发布

最近&#xff0c;收到一位粉丝投稿&#xff0c;他说&#xff1a;“阿里三面凉凉了&#xff0c;输在了微服务上。” 在看到微服务的面试题后&#xff0c;整个人都是懵的&#xff0c;发现没有经验的自己&#xff0c;一窍不通。 如今&#xff0c;微服务已经成为Java开发者必备的…

深入篇【C++】string类的常用接口介绍:标准库中的string类 【万字总结】

深入篇【C】string类的常用接口介绍&#xff1a;标准库中的string类 Ⅰ.string类介绍Ⅱ.string类的常用接口①.string类对象的常用构造1.string()2.string(const char*ch)3.string(const string& str)4.string(size_t n,char c)5.string(const string& str,size_t pos,…

想开发测试工具,应该如何入手?

何为测试工具&#xff1f;就是能辅助测试同学来完成特定的操作的工具&#xff0c;比如常见的如postman、Fiddler、Charles、jira&#xff0c;包括jmeter等&#xff0c;当然还包括公司自己开发的用例转换工具&#xff0c;造数工具&#xff0c;Mock工具或是平台等等。一般以应用程…

测试在“鸡头”和“凤尾”间如何选择?

经常在知乎上碰到这样的问题&#xff1a;同时拿到多个offer&#xff0c;公司有大有小&#xff0c;有创业型有成熟性&#xff0c;怎么在“鸡头”和“凤尾”间做选择&#xff1f; 为什么会纠结呢&#xff1f;通常创业型公司&#xff0c;给优秀的测试员的薪酬远高于市场平均值&…

“我只想找个测试岗,你却百般刁难我!”给我们带来的思考

最近看到一篇帖子&#xff0c;讲的是一个七八年的大龄测试员被公司补偿性裁员后&#xff0c;找工作的糟心经历。 原文是酱紫的&#xff1a; ---------------------------------------- 不管怎么说&#xff0c;我做测试也有七八年了&#xff0c;一直觉得自己的技术还是可以的&…

MongoDB实际场景应用

你要构建一个在线零售商店&#xff0c;这个店铺需要处理会员数据、订单数据以及商品数据等。为了保存和管理这些数据&#xff0c;你可以使用MongoDB。 目录 1. 设计数据模式 2. 插入数据 3. 查询数据 1. 设计数据模式 对于在线零售商店的数据&#xff0c;你可以设计三个Mo…

3年经验,面试测试岗20k都拿不到了吗?

我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…

C#基于云计算SaaS模式的医学检验云LIS系统全套源码

一、云LIS系统概述&#xff1a; 云LIS系统是一种基于云计算技术的实验室信息管理系统&#xff0c;它的主要功能是管理实验室中的各种信息数据&#xff0c;包括样品数据、检测结果、仪器设备管理、质控管理等。 二、与传统的LIS系统相比&#xff0c;云LIS系统具有以下优势&…

考完PMP后,还有必要考NPDP吗?

PMP证书目前在国内有很高的知名度&#xff0c;报考人数也在逐年上升&#xff0c;可以说&#xff0c;几乎所有的项目经理都有过考PMP的计划。 但随着PMP的持证人数越来越多&#xff0c;不少考完PMP的项目经理&#xff0c;开始考虑要不要报名NPDP考试。 那么考完PMP后有必要考N…

软件测试项目拿到不知道从哪里下手?今天我手把手教你

1.登录页面 2.首页 3.项目管理 4.测试环境 1>设置headers&#xff1b;可以每个url设置共同的header&#xff0c;可以存在变量&#xff1b;执行时&#xff0c;指定接口补全header&#xff1b; 5.接口管理 swagger导入功能&#xff1b;根据指定的测试环境url&#xff0c;导入s…

基于javaweb jsp+SSM 网红书店图书借阅系统的设计与实现

一.项目介绍 本系统分为管理员和读者两类 管理员&#xff1a;维护管理员账号和读者账号信息、维护书籍分类信息、维护书籍信息、维护书籍借阅信息、维护书籍预约信息、邮件管理、书籍阅读量统计、系统管理 读者&#xff1a;书籍借阅、书籍预约、预约邮件管理以及个人信息 …