java – 在服务器崩溃/关闭后恢复Asynch ThreadPoolTask??execut
发布时间:2020-12-15 02:17:43 所属栏目:Java 来源:网络整理
导读:我有一个 Spring rest控制器,它使用Spring的@Async方法调用异步方法,并立即向客户端返回一个http 202代码(Accepted).(异步作业很重,可能导致超时). 实际上,在异步任务结束时,我正在向客户发送一封电子邮件,告诉他他的请求的状态. 一切正常,但我问自己,如果我
我有一个
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()); } } 谢谢 解决方法
对于Web服务器关闭,java Web应用程序中的应用程序生命周期通常为
ServletContextListener.如果提供ServletContextListener的实现,则可以在contextDestroyed方法中放置“已处理的内容”逻辑.
当再次启动Web服务器或应用程序时,可以使用侦听器使用contextInitialized方法恢复对作业的未处理项目进行重新处理. 另一种选择是使用Spring destruction callbacks并将逻辑放在这里. HTH (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |