Spring延时初始化RocketMQ消费者

本文介绍如何在Spring容器中采用延时加载的方式初始化RocketMQ消费者,以避免因容器初始化失败而导致的MQ消费问题。通过设置消费者Bean为懒加载,并在容器启动完成后手动触发初始化,确保MQ消费的稳定性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring加载RocketMq消费者实例后会立即开始消费,不论Spring容器是否初始化完毕。这就意味着如果Spring容器由于某种原因导致容器初始化失败,但应用程序没有因为容器初始化失败而关闭,那么会出现不可预期的后果,例如Spring容器初始化失败,导致定时任务不能正常执行,而MQ消费需要定时任务从数据库中拉取的配置信息,这样会导致MQ消费失败。因此,可以在Spring容器启动完成后再初始化MQ消费者。

通过XMLJava配置Bean,都可以指定lazy-init的属性,它有truefalse两个值

true:延时加载,当有其他Bean有引用此Bean时或者主动调用BeanFactory#getBean方法时才会进行初始化
false:立即加载

如果你只使用了lazy-init = trueMQ消费者并不会启动,如上所说,当有其他Bean有引用此Bean时或者主动调用BeanFactory#getBean方法才会进行初始化

延时初始化MQ消费者示例:

配置

<!-- 自定义实现的消息监听 -->
<bean name="messageListenerImpl" class="com.MessageListenerImpl"/>
<!-- 消费者实例 -->
<bean id="consumer" class="org.apache.rocketmq.client.consumer.DefaultMQPushConsumer" init-method="start"
	  destroy-method="shutdown" lazy-init="true">
	<property name="namesrvAddr" value="1.1.1.1:9876"/>
	<property name="instanceName" value="push"/>
	<property name="consumerGroup" value="CONSUMER_GROUP"/>
	<property name="subscription">
		<map>
			<entry key="TOPIC" value="TAGS"/>
		</map>
	</property>
	<property name="messageListener" ref="messageListenerImpl"/>
	<property name="consumeThreadMin" value="2"/>
	<property name="consumeThreadMax" value="4"/>
	<property name="consumeMessageBatchMaxSize" value="1"/>
</bean>

消费监听

public class MessageListenerImpl implements MessageListenerConcurrently {

    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        try {
            for (MessageExt message : msgs) {
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
}

使用Spring容器监听器,在容器启动成功后初始化MQ消费者

// 一个应用中可以有多个ApplicationListener,先加载的先执行
@Component
public class RocketMqInit implements ApplicationListener<ContextStartedEvent> {
    @Resource
    private ApplicationContext applicationContext;
    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        applicationContext.getBean(DefaultMQPushConsumer.class);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值