Как завершить весеннюю пакетную работу изящно? (текущие рабочие места должны быть завершены) - PullRequest
1 голос
/ 08 апреля 2020

У меня весеннее пакетное приложение, и оно содержит несколько заданий. Мне нужно корректно завершить работу приложения при отправке сигнала 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 уже закрыт. Таким образом, текущее задание не может быть выполнено дальше.

Есть ли способ удерживать контекст приложения закрытым / уничтоженным до тех пор, пока не будут завершены отложенные / выполняющиеся в данный момент задания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...