Springboot ApplicationRunner 详解
在项目中写了一个ApplicationRunner 来启动消费队列线程,结果启动的时候applicationRunner的run方法死活不被调用。通过debug发现,在springboot初始化完环境refresh context之后就会调用started listener然后调用application runner,如果started listner 存在阻塞的话就会导致后续的applicati
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当中尽量启用线程来跑阻塞而不是直接去跑阻塞任务。
更多推荐
所有评论(0)