spring - 如何优雅地关闭 Spring Batch Job?(当前正在运行的作业应该完成)
问题描述
我有一个弹簧批处理应用程序,它包含多个作业。KILL
从命令行发送信号时,我需要优雅地关闭应用程序。它应该等到当前运行的作业完成。(同时,它不应该接受来自调度程序的新作业)。
这是我的 Spring Boot 应用程序配置。
@SpringBootApplication
@EnableScheduling
@EnableBatchProcessing
public class SpringBootBatchExampleApplication {
public static void main(String[] args) {
SpringApplicationBuilder app = new SpringApplicationBuilder(SpringBootBatchExampleApplication.class)
.web(WebApplicationType.NONE);
app.registerShutdownHook(true);
app.build().addListeners(new ApplicationPidFileWriter("/shutdown.pid"));
app.run(args);
}
@Bean
TaskSchedulerCustomizer taskSchedulerCustomizer() {
return taskScheduler -> {
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
};
}
@PreDestroy
public void onDestroy() throws Exception{
Thread.sleep(5000);
}
}
每当我在作业执行过程中发送应用程序 kill 时,发出信号,它会调用 destroy 方法并等待 5 秒。
在它开始恢复作业执行并突然终止整个进程后,由于 ApplicationContext 已经关闭,出现一些异常。因此当前作业无法进一步执行。
有没有办法让应用程序上下文关闭/销毁,直到挂起/当前运行的作业完成?