2016-12-09 7 views
4

У меня есть контроллер 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

ответ

0

Для завершения работы веб-сервера жизненный цикл приложения в веб-приложении java не укажет номер ServletContextListener. Если вы предоставляете реализацию ServletContextListener, вы можете поместить свою логику «что уже обработано» в метод contextDestroyed.

При повторном запуске веб-сервера или приложения прослушиватель может использоваться для восстановления повторной обработки необработанных элементов вашего задания с использованием метода contextInitialized.

Другой вариант - использовать Spring destruction callbacks и поместить здесь логику.

HTH