我有一个过程,是一个无限循环:如何在Spring Boot中管理无限过程?
public class MyProcess {
public void start() {
while (true) {
//process
}
}
}
当我开始使用Spring的引导,我的第一个方法是让从上下文的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在外部管理它。
这是正确的方法还是我错过了一个步骤?应用程序是否应该独立并在发生故障后重新启动进程?
这是我做的第一,但我从来没有见过,在任何例子,所以我不知道。那么CommandLineRunner的目的是什么? – Djon
@Djon我有同样的问题。看起来这是一种在运行环境中使用注入bean访问命令行参数的方式(在应用程序启动后)。我使用命令行应用程序的CommandLineRunner接口 – ruX