Spring延时初始化RocketMQ消费者

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消费者示例:

配置





	
	
	
	
		
			
		
	
	
	
	
	

消费监听

public class MessageListenerImpl implements MessageListenerConcurrently {

    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List 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 {
    @Resource
    private ApplicationContext applicationContext;
    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        applicationContext.getBean(DefaultMQPushConsumer.class);
    }
}

你可能感兴趣的:(#,RocketMQ,#,spring,spring延时初始化bean,mq延时初始化)