SpingBoot 使用@Scheduled實現一個定時清理任務
阿新 • • 發佈:2018-11-04
實現定時任務的方法有很多種,@Scheduled註解,scheduleAtFixedRate,timer,quartz等等。
我選擇了@Scheduled,相對而言,可以讓任務定點執行,並且比較簡單。
首先在主類添加註解 @EnableScheduling ,使Scheduled可用。
之後新建一個定時清理類,並實現該類的定時清理方法,在定時清理方法前加上@Scheduled的註解以及corn表示式,corn表示式規定了定時任務的啟動時間。以我下文為例,@Scheduled(cron = "0 0 0 * * ?")表示定時任務在每天0點啟動,你可以通過 http://cron.qqe2.com/
以上(加粗&下劃線),就是利用@Scheduled實現定時清理任務的方法,很簡單吧。如下是我實現的例子,有興趣可以看一下。
我實現了一個 對於每個No. 如果它在資料庫中記錄超過50條,那麼就進行清理的 定時任務。
首先從表中獲取了No.們以及他們出現的次數,由於是使用mybatis進行獲取,所以返回了一個map list,對他處理了一下,獲得每個No.以及他們出現的次數count,判斷若大於50,則清理50以外的部分。
package com.test.service; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.test.dao.ChangeLogDao; /** * 定時清理t_result_log日誌 * */ @Component public class TimeCleaning { @Autowired private ChangeLogDao ChangeLogDao; private static final int MAXCOUNT = 50; // 每隔一分鐘觸發 // @Scheduled(cron = "0 0/1 * * * ?") // 每5秒觸發 // @Scheduled(cron = "*/5 * * * * ?") // 每天零點觸發 @Scheduled(cron = "0 0 0 * * ?") public void timeCleaning() { // 獲取caseNo-count map List<Map<String, Object>> NoCountList = ChangeLogDao.getNoCount(); String No = null; int Count = 0; for(Map<String, Object> mapListItem:NoCountList) { for(Map.Entry<String, Object> entry:mapListItem.entrySet()) { if ("COUNT1".equals(entry.getKey())) { Count = Integer.parseInt(String.valueOf(entry.getValue())); } else if ("caseNo".equals(entry.getKey())) { No = String.valueOf(entry.getValue()); } } if (Count > MAXCOUNT) { ChangeLogDao.delResultChangeLog(No, Count - MAXCOUNT); } } } }
/** * 獲取用No以及他們在result_changelog中次數 * * @return */ public List<Map<String, Object>> getNoCount(); /** * 定期刪除結果變更記錄 * * @auth veast 2018年8月24日 * @param No * @param deleteCount */ public void delResultChangeLog(@Param(value = "No") String No, @Param(value = "deleteCount") int deleteCount);