我有一个Spring rest控制器,它使用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());
}
}
谢谢
对于Web服务器关闭,Java Web应用程序中的应用程序生命周期将通知ServletContextListener。如果提供ServletContextListener的实现,则可以在contextDestroyed
方法中放入“已处理的内容”逻辑。
再次启动Web服务器或应用程序时,可以使用该contextInitialized
方法使用侦听器恢复对作业中未处理项目的重新处理。
另一种选择是使用Spring破坏回调并将逻辑放在这里。
高温超导
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句