使用spring的@Scheduled註解執行定時任務,啓動項目不輸出警告

在applicationContext.xml中添加:html

xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd">


<task:annotation-driven executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="5" />
<task:scheduler id="myScheduler" pool-size="10" />

 

java代碼:java

@Component
public class CleanExpireTokenTask {

    private Logger logger = LoggerFactory.getLogger(LogTag.BUSINESS);
    
    @Scheduled(cron = "0 * * * * ?")
    public void startUpdateSaleThread(){
        try{
            System.out.println("check token expire");
        }catch(Exception e){
            logger.error("Make salesReport faild",e);
        }
    }
}

 

注意:spring

實現類上要加註解@Component安全

定時器的任務方法不能有返回值app

配置及啓動報錯問題參考自
 
2016-11-22日 安全關閉spring定時任務線程池
java代碼
 
  

@Resource(name = "myScheduler")
private ThreadPoolTaskScheduler threadPoolTaskScheduler;dom

/**
* 等待正在執行的定時任務執行完畢,再也不執行新的定時任務,
*/
public void shutdown(){
  threadPoolTaskScheduler.shutdown();
  // 等待任務執行完畢
  while(threadPoolTaskScheduler.getActiveCount() > 0){
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}測試

 

注:1.根據測試,經過此方式建立的定時任務,好比每分鐘0秒執行任務,若是上一分鐘0秒執行的任務還沒執行完,則此次任務就不會啓動。
  2.在ThreadPoolTaskScheduler調用shutdown方法後,不會殺掉正在執行的任務,已啓動的定時任務能夠執行完,這時若是定時任務執行Thread.sleep方法,會拋 InterruptedException,須要注意。
參考自
相關文章
相關標籤/搜索