我有一个无限循环的过程:
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
,这导致了相同的阻止状态。
而不是这个,我现在在@Async
方法上使用CommandLineRunner#run
注释。
这似乎是最好的解决方案,因为应用程序在任务开始后完成启动。任何Exception
都将被选中并记录,但Sprint创建的支持Executor
会阻止应用程序关闭。
我假设有一种方法可以让Spring终止Executor
,这样整个应用程序就可以退出了,因为我在Supervisor上进行外部管理。
这是正确的做法还是我错过了一步?应用程序是否应该独立并在失败后重新启动进程?
答案 0 :(得分:1)
在主线程中做一些工作。在没有myProcess.start()
的情况下从main()
拨打@Async
有什么问题?完成工作后,请在MyProcess#start