Java 在服务器崩溃/关闭后恢复异步ThreadPoolTaskexecutor

Java 在服务器崩溃/关闭后恢复异步ThreadPoolTaskexecutor,java,spring,asynchronous,executor,Java,Spring,Asynchronous,Executor,我有一个SpringREST控制器,它正在使用Spring的@Async方法调用一个异步方法,并立即向客户端返回一个http 202代码(已接受)(异步作业很繁重,可能导致超时)。 实际上,在异步任务结束时,我会向客户发送一封电子邮件,告诉他请求的状态 一切正常,但我在问自己,如果我的服务器/jvm崩溃或关闭,我该怎么办?我的客户将收到202代码,并且永远不会收到状态电子邮件 有没有一种方法可以(实时)同步数据库甚至文件中的ThreadPoolTaskExecutor,让服务器在启动时恢复,而无

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

一切正常,但我在问自己,如果我的服务器/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

对于web服务器关闭,java web应用程序中的应用程序生命周期将通知。如果提供ServletContextListener的实现,则可以将“已处理的内容”逻辑放入
ContextDistromed
方法中

当web服务器或应用程序再次启动时,可以使用侦听器恢复一个会话,然后使用
contextInitialized
方法重新处理作业中未处理的项

另一个选择是使用并将逻辑放在这里