服务器崩溃/关闭后恢复Asynch ThreadPoolTask​​executor

时间:2016-12-09 14:16:58

标签: java spring asynchronous executor

我有一个Spring rest控制器,它使用Spring的@Async方法调用异步方法,并立即向客户端返回一个http 202代码(Accepted)。(异步作业很重,可能导致超时)。 实际上,在异步任务结束时,我发送一封电子邮件给客户,告诉他他的请求状态。

一切正常,但是我问自己,如果我的服务器/ jvm崩溃或是否关机,我该怎么办?我的客户将收到202代码,永远不会收到状态电子邮件。

有没有办法在数据库中甚至在文件中同步(实时)ThreadPoolTask​​Executor,让服务器在启动时恢复,而不用自己管理复杂的规则和进化状态?

这是我的Executor配置

@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

1 个答案:

答案 0 :(得分:0)

对于Web服务器关闭,Java Web应用程序中的应用程序生命周期不会是ServletContextListener。如果您提供ServletContextListener的实现,则可以在contextDestroyed方法中放置“已处理的内容”逻辑。

当再次启动Web服务器或应用程序时,可以使用侦听器使用contextInitialized方法恢复重新处理作业中未处理的项目。

另一种选择是使用Spring destruction callbacks并将逻辑放在这里。

HTH