-
Couldn't load subscription status.
- Fork 38.8k
Description
Using graceful shutdown with async task ran with
CompletableFuture
.runAsync(() -> {
}, executor)Using @EnableScheduling and the executor applicationTaskExecutor the graceful shutdown don't take in account the currently running tasks, when the server shutdown the task is silently aborted (no InteruptedException).
Using a custom Executor:
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(2);
taskExecutor.setMaxPoolSize(2);
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(1);
taskExecutor.setVirtualThreads(true);
taskExecutor.initialize();The graceful shutdown wait 1 second before the end of the task, and the log [WARN] - Forcing shutdownNow() - Tasks did not stop in time. is displayed. But no InterruptedException is thrown in the Runnable.
To have an InterruptedException I should create a scheduler like that
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(2);
taskExecutor.setMaxPoolSize(2);
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(1);
taskExecutor.setVirtualThreads(true);
taskExecutor.initialize();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
log.info("Waiting for executor to terminate...");
ThreadPoolExecutor executor = taskExecutor.getThreadPoolExecutor();
if (executor != null) {
if (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
log.warn("Forcing shutdownNow() - Tasks did not stop in time.");
executor.shutdownNow();
}
}
} catch (InterruptedException e) {
log.error("Shutdown hook interrupted!", e);
Thread.currentThread().interrupt();
}
}));Doing that the graceful shutdown wait 1 second and stop the task with an InterruptedException.
The goal of the InterruptedException is to be able to log the stopped task, to know that something should be retry.
Why the default ThreadPoolTaskExecutor don't offer a way to have an InterruptedException. Is it possible to add this feature? To avoid to write it manually ?