如何在Spring Boot中管理无限进程?

我有一个无限循环的过程:

public class MyProcess { public void start() { while (true) { //process } } } 

当我开始使用Spring Boot时,我的第一种方法是在应用程序启动后从上下文中获取bean并手动启动该进程:

 @SpringBootApplication public class MyApplication { public static void main(String[] args) { ApplicationContext applicationContext = SpringApplication.run(MyApplication.class, args); MyProcess myProcess = applicationContext.getBean(MyProcess.class); myProcess.start(); } } 

这工作但似乎不是正确的方法,所以我实现了一个CommandLineRunner

 @Component public class MyRunner implements CommandLineRunner { @Autowired private MyProcess myProcess; @Override public void run(String... args) { this.myProcess.start(); } } 

这几乎和以前一样,但是这里的SpringApplication#run调用从未实际完成,这似乎也是错误的。 我认为这是正确的吗?

然后我尝试用Executor自己管理它,但是为了捕获任何Exception我不得不调用Future#get导致相同的阻塞状态。

而不是这个,我现在在CommandLineRunner#run方法上使用@Async注释。

这似乎是最好的解决方案,因为应用程序在任务开始后完成启动。 将拾取并记录任何Exception ,但Sprint创建的后备Executor阻止应用程序关闭。

我假设有一种方法要求Spring终止Executor程序,以便整个应用程序可以退出,因为我在外部使用Supervisor进行管理。

这是正确的方法还是我错过了一步? 应用程序是否应该独立并在发生故障后重新启动进程?

在主线程中做一些工作。 没有@Asyncmain()调用myProcess.start()有什么问题? 当你完成你的工作时,只需在MyProcess#start保留循环