首頁 > 軟體

Spring Task定時任務的實現詳解

2022-08-10 14:03:06

Spring Task定時任務

Cron表示式

以6-7位的一組數位,中間用空格間隔的字串,表達一種時間

每位的含義及取值範圍:

秒(0-59) 分(0-59) 時(0-23) 日(1-31) 月(1-12) 周(1-7或SUN-SAT) 年(四位數,可省略)

符號的含義:

  1. *表示所有值(秒位是*,則表示每秒)
  2. ?表示未說明的值,(日和周必須有一位為?,因為不合邏輯)
  3. -表示一個指定的範圍
  4. ,表示一個可能值
  5. /符號前表示開始時間,符號後表示每次遞增的值
  6. L最後的,在’天’上表示這個月最後一天,用在’周’上表示’7或SUN’,在週上與數位一起,如"7L"表示這個月的最後一個週六(阿麥利卡日曆,1表示週日)
  7. W只能用在’天’上, 用來描敘最接近指定天的工作日(週一到週五) ,如"15W"指"最近接這個月第15天的工作日",如果第15天是週六,那麼會在第14天即週五觸發
  8. # 只能在’周’上使用,用來指定這個月的第幾個周幾,如’6#3’表示這個月的第三個週五(6表示週五,3表示第三週).如果指定日期不存在,那麼將不會觸發
  9. C指和canlendar聯絡後計算過的值,如在’天’上標註’5C’指這個月第五天或之後包括canlendar的第一天;在’周’上標’1C’指這週日或之後包括calendar的第一天.

當然不理解也沒關係,網上一搜就有很多Cron表示式線上生成器

實現定時任務

背景

使用非同步進行檔案上傳,將獲取token檔案存到資料庫中,如果使用者在提交表單之前反覆上傳檔案會產生很多殭屍資料,需要使用定時任務刪除殭屍token欄位和上傳到伺服器的圖片

實現

開啟任務排程

@EnableScheduling //開啟任務排程
@SpringBootApplication
public class UploadApplication {
    public static void main(String[] args) {
        SpringApplication.run(UploadApplication.class, args);
    }
}

編寫清除殭屍token業務

//mapper
//獲取殭屍token的id
List<Integer> selectDeadTokens();
//清除殭屍資料
int deleteDeadToken(@Param("ids") List<Integer> ids);
<delete id="deleteDeadToken">
       delete from imagetoken where id in
       <foreach collection="ids" item="e" open="(" separator="," close=")">
           #{e}
       </foreach>
</delete>
<select id="selectDeadTokens" resultType="java.lang.Integer">
        SELECT id FROM imagetoken t
        WHERE t.token NOT IN (select token FROM good)
</select>
//service 
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE)
    @Override
    public void deleteDeadToken() {
        System.out.println("---開始清除所有殭屍token---");
        List<Integer> list = imagetokenMapper.selectDeadTokens();
        System.out.println("已找到"+list.size()+"條資料");
        if (list.size()>0) {
            int result = imagetokenMapper.deleteDeadToken(list);
            System.out.println("本次刪除"+result+"條資料");
        }
    }

查詢資料庫中存放檔案地址的集合

 @Override
    public List<String> getList() {
        //條件構造器 查存放地址
        LambdaQueryWrapper<Good> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(Good::getSavepath);
        //this指的是當前service
        List<Good> list = this.list(queryWrapper);
//        System.out.println("查詢到的資料:");
//        System.out.println(list);
        //獲取資料庫中所有圖片的絕對路徑List<String>
        ArrayList<String> paths = new ArrayList<>();
        //將查到的資料中的檔案地址遍歷到String型別的list中
        list.stream().forEach(good -> {
            paths.add(good.getSavepath());
        });
        //System.out.println("查到的路徑:"+paths);
        return  paths;
    }

使用@Scheduled註解開啟任務排程

@Value("${image.savepath}")
    String savePath;
    /**
     * 每天晚上23點清除無效token資料並刪除圖片
     */
    @Scheduled(cron = "0 0 23 * * ?")
    public void delete(){
        //1.清除無效token
        imagetokenService.deleteDeadToken();
        //2.刪除殭屍檔案
        //2.1獲取資料庫中檔案儲存列表
        List<String> paths = goodService.getList();
        //2.2 獲取圖片儲存地址
        File target=new File(savePath);
        //2.3遍歷圖片儲存所在資料夾的檔案
        File[] files=target.listFiles();
        for (File file : files) {
            if (file.isFile()){
                //2.4獲取儲存檔案的絕對地址,需要將碟符修改,
                String absPath = file.getAbsolutePath().replaceAll("\\", "/");
                //2.5將不存在的檔案刪除
                if(!paths.contains(absPath)){
                     //System.out.println("要刪除檔案的覺得路徑:"+absPath);
                     file.delete();
                 }
            }
        }
    }

到此這篇關於Spring Task定時任務的實現詳解的文章就介紹到這了,更多相關Spring定時任務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com