2016-12-09 79 views
4

我有一個Spring Rest控制器,它使用Spring的@Async方法調用異步方法,並立即返回一個http 202代碼(Accepted)給客戶端(異步作業很重並可能導致超時)。 實際上,在異步任務結束時,我向客戶發送一封電子郵件,告訴他他的請求狀態。服務器崩潰/關閉後恢復Asynch ThreadPoolTask​​executor

一切正常,但我問自己,如果我的服務器/ 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(); 
    } 

} 

是啓動異步任務

@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

回答

0

對於Web服務器關閉,Java Web應用程序中的應用程序生命週期將通知ServletContextListener。如果你提供了一個ServletContextListener的實現,你可以在contextDestroyed方法中放置'已處理的內容'邏輯。

當Web服務器或應用程序再次啓動時,可以使用偵聽器恢復使用contextInitialized方法重新處理未處理的作業項目。

另一種選擇是使用Spring destruction callbacks並將邏輯放在這裏。

HTH

相關問題