У меня есть контроллер Spring Spring, который вызывает асинхронный метод с использованием методологии Spring @Async и немедленно возвращает код http (Accepted) клиенту (асинхронное задание тяжелое и может привести к таймауту). Итак, в конце асинхронной задачи я отправляю электронное письмо клиенту, сообщая ему статус его запроса.Восстановить Asynch ThreadPoolTaskexecutor после сбоя/закрытия сервера
Все работает нормально, но я спрашиваю себя, что мне делать, если мой сервер/jvm выйдет из строя или если он выключен? Мой клиент получит код 202 и никогда не получит адрес электронной почты статуса.
Есть ли способ синхронизировать (в режиме реального времени) ThreadPoolTaskExecutor в базе данных или даже в файле, чтобы сервер восстанавливался при запуске без самостоятельного управления этим со сложными правилами и статусом эволюции?
Вот моя конфигурация Исполнитель
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("asyncTaskExecutor-");
executor.setAwaitTerminationSeconds(120);
executor.setKeepAliveSeconds(30);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
Контроллер, что запуск Асинхронный задачу
@RequestMapping(value = "/testAsync", method = RequestMethod.GET)
public void testAsync() throws InterruptedException{
businessService.doHeavyThings();
}
Метод асинхронной называется:
@Async
public void doHeavyThings() throws InterruptedException {
LOGGER.error("Start doHeavyThings with configured executor - " + Thread.currentThread().getName() + " at " + new Date());
Thread.sleep(5000L);
LOGGER.error("Stop doHeavyThings with configured executor - " + Thread.currentThread().getName() + " at " + new Date());
}
}
THx