gpt4 book ai didi

java - 服务器崩溃/关闭后恢复 Async ThreadPoolTask​​executor

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:35 26 4
gpt4 key购买 nike

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

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

有没有办法在数据库甚至文件中同步(实时)ThreadPoolTask​​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();
}

}

启动异步任务的 Controller

@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());
}

谢谢

最佳答案

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

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

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

HTH

关于java - 服务器崩溃/关闭后恢复 Async ThreadPoolTask​​executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41062415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com