首页 > 解决方案 > 如何优雅地关闭 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 已经关闭,出现一些异常。因此当前作业无法进一步执行。

有没有办法让应用程序上下文关闭/销毁,直到挂起/当前运行的作业完成?

标签: springspring-bootspring-batch

解决方案


推荐阅读