如何在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进行管理。
这是正确的方法还是我错过了一步? 应用程序是否应该独立并在发生故障后重新启动进程?
在主线程中做一些工作。 没有@Async
从main()
调用myProcess.start()
有什么问题? 当你完成你的工作时,只需在MyProcess#start
保留循环