ApplicationRunner介绍

ApplicationRunner是在应用容器启动之后会回调到,在ApplicationStartedListener调用之后被调用。如果说ApplicationListener中有阻塞,那么ApplicationRunner也都不会被调用。

@Component
public class ApplicationRunnerTest implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(args);
    }
}

我们可以在applicationRunner中做一些异步启动的操作,比如实例化Kafka客户端,异步加载缓存等等在服务启动之后不立马提供服务的操作。

通过分析源码可以知道runner实在容器加载完成以及ApplicationStartedListener调用之后进行回调的。

 

ApplicationRunner为什么不被调用

问题描述

在项目中写了一个ApplicationRunner 来启动消费队列线程,结果启动的时候applicationRunner的run方法死活不被调用。

问题分析

通过debug发现,在springboot初始化完环境refresh context之后就会调用started listener然后调用application runner,如果started listner 存在阻塞的话就会导致后续的application runner 不被运行。而我在另一个组件中使用ApplicationListener<ApplicationStartedEvent> 去启动了netty server,启动netty server会导致当前线程阻塞以至于application runner 不被调用。

问题解决

在listener和Runner当中尽量启用线程来跑阻塞而不是直接去跑阻塞任务。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐