2015-08-30 119 views
0

我使用@Scheduled註釋來運行cron作業。調度工作一段時間,然後停止工作。 我會給我的代碼簡化的片段:Spring 4 @Scheduled停止工作

這是調度:

//org.springframework.scheduling.annotation.Scheduled 
@Scheduled("*/30 * * * * *")  
public void performTask() { 
    logger.info("Starting agent"); 
    getAgentAsyncTask().execute(); 
    logger.info("Ending agent"); 
} 

這是由調度

//org.springframework.scheduling.annotation.Async 
@Async(TASK_EXECUTOR) 
@Override 
public void execute() { 
    logger.info("Starting task"); 
    //send some rest requests 
    logger.info("Ending task"); 
} 

兩個執行任務:「啓動劑」和「結束代理「記錄的次數相等。所以,每個計劃都會正常結束。

兩者:「開始任務」和「結束任務」被記錄相同的次數。所以,「任務」絕對不是阻礙事物。

但它只是在一段時間後停止記錄。什麼可能是這個問題?

這裏,TASK_EXECUTOR如下豆:

@Bean(TASK_EXECUTOR) 
public ThreadPoolTaskExecutor createDefaultTaskExecutor() { 
      ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor(); 
      te.setMaxPoolSize(15); 
      te.setCorePoolSize(15); 
      te.initialize(); 
      return te; 
    } 

Spring版本:

4.1.6.RELEASE

+0

你在容器內部還是外部運行?另外,什麼版本的Java? – Brad

+0

容器內部(基於Annotation的配置,我有@EnableScheduling @EnableAsync)。 Java版本8 – coolscitist

+4

你讀過嗎? http://stackoverflow.com/q/17909404/206466 – xenoterracide

回答

7

這種情況可能會在一個無限循環引起的預定方法的主體,或者是否存在對外部系統的調用,並且控件同步等待以在沒有任何超時的情況下接收響應。

用這個簡單的代碼片段自己試一試。該方法將僅啓動一次,並且在指定的5秒間隔後不會啓動。

@Scheduled(fixedRate = 5000) 
public void printPeriodically() { 
    System.out.println("This is my periodic method"); 
    while(true) {}; 
} 
0

看看工作是否被吊死。如果它確實如此,那麼任務在一段時間後不會執行,我的意思是在達到最大池大小之後。檢查執行代碼是否在成功執行後釋放線程。