RocketMq 同组消费者 自动设置InstanceName

news/2025/2/14 8:15:23/

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 {@AutowiredMqJudgePacsConfig mqJudgePacsConfig;@Overridepublic 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.ppmy.cn/news/364086.html

相关文章

工作后,重新学习 ES6+

工作后&#xff0c;重新学习 ES6 前言一、ES5 & ES6 基础知识1、变量声明方式1-1 var 声明方式&#xff08;variable 变量&#xff09;1-2 新的声明方式&#xff1a;let1-3 新的声明方式&#xff1a;const小结 2、解构赋值小结 3、数组的遍历3-1 ES5 中遍历数组的方式3-2 E…

最新android 电脑系统,android l操作系统|android l操作系统最新版 - 系统天堂

Android新一代操作系统被称为“L”&#xff0c;采用被称为“材料设计”的全新设计语言&#xff0c;这是谷歌为了解决碎片化问题的重要举措&#xff0c;将统一包括手机、 平板、笔记本以及网页端设计风格。谷歌将提供设计中正确的角度以及合适的阴影&#xff0c;并告诉如何搭配按…

Accessibility辅助功能--一念天堂,一念地狱

0x00什么是Accessibility&#xff08;辅助功能&#xff09; 考虑到部分用户不能很好地使用Android设备&#xff0c;比如由于视力、身体、年龄方面的限制&#xff0c;造成阅读内容、触控操作、声音信息等方面的获取困难&#xff0c;Android提供了Accessibility特性和服务帮助用…

数字化城市大脑赋能社会治理现代化体系新动能

城市的核心是人&#xff0c;人的本体意义就在于追求幸福。以人为核心&#xff0c;容纳和助成幸福的达成&#xff0c;是城市存在的价值&#xff0c;也是实现城市治理体系和治理能力现代化的最佳选择。今日&#xff0c;城市居民的幸福感知与能力&#xff0c;已不同往日。近百年未…

au3 mysql_autoit3 下载|autoit(au3.0)英文官方安装版 3.3.12.0 - 系统天堂

autoit3是用以编写并生成具有 BASIC 语言风格的脚本程序的免费软件&#xff0c;au3.0下载它被设计用来在Windows GUI(用户界面)中进行自动操作。通过它可以组合使用模拟键击、鼠标移动和窗口/控件操作等来实现自动化任务&#xff0c;而这是其它语言所无法做到或尚无可靠方法实现…

取消wps右键菜单_一款神器级别的神器 超级右键 iRightMouse | Mac软件天堂

小伙伴们&#xff0c;感谢关注「Mac软件天堂」&#xff0c;遇到“XX已损坏”、“XX意外退出”、“无法确认开发者”等问题记得点击菜单栏的「帮助」解决哦 &#xff01;同时&#xff0c;也可以点击链接➡️必看&#xff01;我要悄悄告诉你遇到这些问题怎么办... 查看解决办法&…

u大师制作linux系统,U大师官方下载|U大师U盘启动盘制作工具官方版 v4.7.37.56 最新版 - 系统天堂...

U大师U盘启动盘制作工具是时下最流行、便捷的U盘装系统和维护电脑的专用工具&#xff0c;无论是电脑菜鸟级别还是专家级别都能轻松使用。制作简单&#xff0c;支持所有U盘一键制作成启动盘&#xff1b;兼容多种机型&#xff1b;支持GHO、ISO系统文件&#xff0c;更支持原版系统…

批处理最完整人性化教程

本文转自https://www.cnblogs.com/s1ihome/archive/2009/01/15/batTutorial.html 这是一篇技术教程&#xff0c;我会用很简单的文字表达清楚自己的意思&#xff0c;你要你识字就能看懂&#xff0c;就能学到知识。写这篇教程的目的&#xff0c;是让每一个看过这些文字的朋友记住…