1. 程式人生 > >SpingBoot 使用@Scheduled實現一個定時清理任務

SpingBoot 使用@Scheduled實現一個定時清理任務

實現定時任務的方法有很多種,@Scheduled註解,scheduleAtFixedRate,timer,quartz等等。

我選擇了@Scheduled,相對而言,可以讓任務定點執行,並且比較簡單。

首先在主類添加註解 @EnableScheduling ,使Scheduled可用。

之後新建一個定時清理類,並實現該類的定時清理方法,在定時清理方法前加上@Scheduled的註解以及corn表示式,corn表示式規定了定時任務的啟動時間。以我下文為例,@Scheduled(cron = "0 0 0 * * ?")表示定時任務在每天0點啟動,你可以通過 http://cron.qqe2.com/

來獲取你想要的cron表示式。

以上(加粗&下劃線),就是利用@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);