李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 走心评论
  • 系列文章
  • Now
  • 每日心情
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 正文

使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理

2022年6月23日 约 614 字3 分钟 10点热度 0人点赞 0条评论
本文最后更新于 2022年6月23日,距今已 1497 天,其中的信息可能已经发生变化,请注意甄别。

背景

我们使用RocketMQ时,一般Consumer启动都是使用的@PostConstruct注解。(@PostConstruct:用于在执行任何初始化时执行依赖注入后需要执行的方法。),或者使用bean的方式配置。

配置如下:

生产者配置

在配置类中配置所有生产者,在业务中注入使用,将生产者的启动和销毁绑定到 Bean 的初始化和销毁上:

@Configuration
public class MQProducerConfig {

    // 第一个生产者
    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public DefaultMQProducer demo1MQProducer() {
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
        defaultMQProducer.setNamesrvAddr("<nameServer>");
        defaultMQProducer.setProducerGroup("<group>");
        defaultMQProducer.setInstanceName("<instanceName>");
        // 其他生产者配置
        return defaultMQProducer;
    }

    // 第二个生产者
    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public DefaultMQProducer demo2MQProducer() {
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
        defaultMQProducer.setNamesrvAddr("<nameServer>");
        defaultMQProducer.setProducerGroup("<group>");
        defaultMQProducer.setInstanceName("<instanceName>");
        // 其他生产者配置
        return defaultMQProducer;
    }

    // ......
}

消费者配置

在配置类中配置所有消费者,将消费者的启动和销毁绑定到 Bean 的初始化和销毁上:

@Configuration
public class MQConsumerConfig {

    // 第一个消费者
    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public DefaultMQPushConsumer demo1Consumer() throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("<group>");
        consumer.setNamesrvAddr("<nameServer>");
        consumer.setInstanceName("<instanceName>");
        consumer.subscribe("<topic>", "<tag>");
        consumer.setMessageListener(<listener>);
        // 其他消费者配置
        return consumer;
    }

    // 第二个消费者
    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public DefaultMQPushConsumer demo2Consumer() throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("<group>");
        consumer.setNamesrvAddr("<nameServer>");
        consumer.setInstanceName("<instanceName>");
        consumer.subscribe("<topic>", "<tag>");
        consumer.setMessageListener(<listener>);
        // 其他消费者配置
        return consumer;
    }

    // ......
}

优化

上述配置在项目启动 Bean 加载的时候就会启动生产者和消费者,导致项目启动慢,并且会在项目还未启动完,就会有大量消息涌入,所以可以使用 ApplicationRunner 或 CommandLineRunner 接口在项目启动成功后再执行 MQ 的启动。同时,去掉Consumer的@PostConstruct注解。

注解如下:

// 去掉initMethod配置
@Bean(destroyMethod = "shutdown")

将上述配置中的消费者启动不再绑定到 Bean 初始化阶段。

新的消费者配置如下:

@Configuration
public class MQConsumerConfig {

    // 第一个消费者
    @Bean(destroyMethod = "shutdown")
    public DefaultMQPushConsumer demo1Consumer() throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("<group>");
        consumer.setNamesrvAddr("<nameServer>");
        consumer.setInstanceName("<instanceName>");
        consumer.subscribe("<topic>", "<tag>");
        consumer.setMessageListener(<listener>);
        // 其他消费者配置
        return consumer;
    }

    // 第二个消费者
    @Bean(destroyMethod = "shutdown")
    public DefaultMQPushConsumer demo2Consumer() throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("<group>");
        consumer.setNamesrvAddr("<nameServer>");
        consumer.setInstanceName("<instanceName>");
        consumer.subscribe("<topic>", "<tag>");
        consumer.setMessageListener(<listener>);
        // 其他消费者配置
        return consumer;
    }

    // ......
}

在项目启动完成节点统一启动消费者:

@Slf4j
@Component
public class MqConsumerApplicationRunner implements ApplicationRunner {

    @Autowired
    private Map<String, DefaultMQPushConsumer> defaultMQPushConsumerMap;

    @Override
    public void run(ApplicationArguments args) {
        if (CollectionUtils.isEmpty(defaultMQPushConsumerMap)) {
            return;
        }
        defaultMQPushConsumerMap.forEach((bean, consumer) -> {
            try {
                consumer.start();
            } catch (MQClientException e) {
                log.error("Consumer bean:[{}] start error.", bean, e);
            }
        }
    }
}
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/3888

推荐阅读

  • SpringBoot常用注解
  • CompletableFuture使用详解
  • SpringBoot 中内置的 49 个常用工具类
  • SpringBoot 实现接口防刷的 5 种实现方案
  • SpringBoot 实现 RSA+AES 自动接口解密
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA MQ RocketMQ SpringBoot
最后更新:2022年6月23日

岁月同一天 7 月 30 日

回望过去的今天,你在写什么

  • 4 年前 2022年7月30日
    看病难~取药难~~

    去一家中医院看病,每次都得排好半天队…… 完了拿着方子去取药,上午十点交的方子,由于是代煎,被告知需要次日下午三点到五点…

相关文章
  • jasypt-spring-boot 使用说明2026年7月7日
  • OOM后,JVM一定会退出吗?为什么?2024年4月15日
  • Maven发布本地项目的jar包和源码到私有仓库(maven-source-plugin的简单使用)2020年5月25日
  • SpringBoot 实现 RSA+AES 自动接口解密2025年5月26日
  • 分布式锁-Java常用技术方案2019年11月11日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

既然选择了远方,便只顾风雨兼程。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能 增加了两套复古皮肤-牛皮纸、千禧网页 Claude Design介绍与使用 Kratos+主题新功能介绍 Taste Skill 说明与使用 jasypt-spring-boot 使用说明
AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
分布式架构知识体系(超全核心知识大图) 为什么 SpringBoot 宁可挨骂也要干掉 spring.factories? 从技术本质到生态关联,一文吃透 AIGC、RAG、Agent、Function Call、MCP SpringBoot常用注解 何谓重构?为何重构? 应用型负载均衡(ALB)和网络型负载均衡(NLB)区别
最近评论
李锋镝 发布于 13 小时前(07月29日) 每个站长追求不一样,有的喜欢简洁,有的喜欢二次元,有的喜欢复古…喜欢就好
老杨 发布于 15 小时前(07月29日) 用什么主题不重要,简单明了最重要,用户体验的事你得问用户。
李锋镝 发布于 6 天前(07月24日) 牛皮纸自带经典款老钱风buff~
满心 发布于 6 天前(07月24日) 牛皮纸还是好看
李锋镝 发布于 7 天前(07月23日) 都是AI的功劳~ :21:
标签聚合
Redis 数据库 日常 AI编程 JVM 架构 Spring 分布式 WordPress docker MySQL 设计模式 AI IDEA K8s SQL JAVA 多线程 ElasticSearch SpringBoot
友情链接
  • 风渡言
  • 林羽凡
  • 搬砖日记
  • 临窗旋墨
  • 韩情脉脉
  • 韩小韩博客
  • Mr.Sun的博客
  • 哥斯拉
  • 知向前端
  • 皮皮社
  • 老张博客
  • Blogs·CN
  • 拾趣博客导航
  • 志文工作室
  • 瓦匠个人小站
  • 彬红茶日记
  • Honesty
  • 懋和道人
  • 旧时繁华

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号