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

时间:2016-08-02 11:25:00

标签: java spring 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,这导致了相同的阻止状态。

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

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

我假设有一种方法可以让Spring终止Executor,这样整个应用程序就可以退出了,因为我在Supervisor上进行外部管理。

这是正确的做法还是我错过了一步?应用程序是否应该独立并在失败后重新启动进程?

1 个答案:

答案 0 :(得分:1)

在主线程中做一些工作。在没有myProcess.start()的情况下从main()拨打@Async有什么问题?完成工作后,请在MyProcess#start

中留下循环