У меня весеннее пакетное приложение, и оно содержит несколько заданий. Мне нужно корректно завершить работу приложения при отправке сигнала KILL
из командной строки. Следует дождаться завершения текущего выполняемого задания. (Между тем, он не должен принимать новые задания из планировщика).
Это моя конфигурация Spring Boot Application.
@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);
}
}
Всякий раз, когда я отправляю уничтожение приложения в середине выполнения задания, сигнализирую, что оно вызывает метод уничтожения и ждет в течение 5 секунд.
После того, как он начинает возобновлять выполнение задания и внезапно завершает весь процесс с некоторым исключением, поскольку ApplicationContext уже закрыт. Таким образом, текущее задание не может быть выполнено дальше.
Есть ли способ удерживать контекст приложения закрытым / уничтоженным до тех пор, пока не будут завершены отложенные / выполняющиеся в данный момент задания?