Spring Boot multiple commandlinerrunner的执行顺序和状态 &g



我有一些启动操作要一个接一个地执行。这两个运行程序执行一些繁重的数据库操作。

@Slf4j
@Data
@Component
@Order(1)
public class MyFailureHandlerA implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
some_io_calls_a();
}
}
@Slf4j
@Data
@Component
@Order(2)
public class MyFailureHandlerB implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
some_io_calls_b();
}
}

我需要确保@Order(2)运行程序只在@Order(1)完成处理后启动。

有没有办法做到这一点,比如给跑步者注册一些策略,这样他们就可以监控他们的完成情况。

我找到了一种方法,就像,我可以去等待,直到一个单例作用域bean变量的值变为真,这是设置只有当第一个跑步者完成它的任务。但我担心这是否值得推荐。

或者,我可以依赖@DependsOn来完成任务吗?使用@DependsOn("MyFailureHandlerA")/MyFailureHandlerB能保证第一跑者完成整个操作吗?

我正在尝试的另一种方法是,从单个运行程序一个接一个地调用服务调用,像这样:

@Slf4j
@Data
@Component
public class MyFailureHandler implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
some_io_calls_q();
some_io_calls_b();
}
}

这是否有意义,并确保操作按顺序一个接一个地执行?

spring-boot-2.3.2

some_io_calls_q();
some_io_calls_b();

如果你的两个方法都执行同步任务,那么使用order就足够了。

命令将按照顺序注释执行。你可以打印一些日志来检查。

否则,异步任务是不够的。你必须控制任务何时/如何完成……

你所描述的最简单的解决方案是在一个命令行程序中调用这两个方法,以防你不确定spring的内部进程。

@DependsOn:只使用流程创建bean。它与命令的执行无关。