SpringBoot 定時任務和任務之間並行執行詳解

使用SpringBoot創建定時任務非常簡單,只需在添加幾個註解就可以實現定時任務。

@Component
@EnableScheduling //在啓動類上註解也可以
public class TestJob {
 
    @Scheduled(cron = "0/10 * * * * ?")
    public void task1(){
        System.out.println(----任務一----);
    }
 
    @Scheduled(fixedRate = 1000 * 10)
    public void task2(){
        System.out.println(----任務二----);
    }
 
    @Scheduled(fixedDelay=1000)
    public void task3(){
        System.out.println(----任務三----);
    }
}

在上面的定時任務中,我們在方法上使用@Scheduled註解來設置任務的執行時間,並且使用三種屬性配置方式:

  1. fixedRate:間隔時間是根據上次任務開始的時候計時的
  2. fixedDelay:間隔時間是根據上次的任務結束的時候開始計時的
  3. cron:通過表達式來配置任務執行時間

cron表達式詳解

一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次爲:

  1. 秒(0~59) 例如0/5表示每5秒
  2. 分鐘(0~59)
  3. 小時(0~23)
  4. 日(0~31)的某天,需計算
  5. 月(0~11)
  6. 周幾( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
  7. 年份(1970-2099)
一些表達式案例:
  • “0 0 10,14,16 * * ?” 每天上午10點,下午2點,4點
  • “0 0/30 9-17 * * ?” 每天早上9點到晚上5點每半小時
  • “0 0 12 ? * WED” 表示每個星期三中午12點
  • “0 15 10 * * ?” 每天上午10:15觸發
  • “0 15 10 * * ? 2005” 2005年的每天上午10:15觸發
  • “0 * 14 * * ?” 在每天下午2點到下午2:59期間的每1分鐘觸發
  • “0 0/5 14 * * ?” 在每天下午2點到下午2:55期間的每5分鐘觸發
  • “0 0/5 14,18 * * ?” 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
  • “0 0-5 14 * * ?” 在每天下午2點到下午2:05期間的每1分鐘觸發
  • “0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44觸發
  • “0 15 10 ? * MON-FRI” 週一至週五的上午10:15觸發
  • “0 15 10 15 * ?” 每月15日上午10:15觸發
  • “0 15 10 L * ?” 每月最後一日的上午10:15觸發0:15觸發
  • “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最後一個星期五上午10:15觸發
  • “0 15 10 ? * 6#3” 每月的第三個星期五上午10:15觸發

spring的定時任務默認是單線程的,不會開啓另一條線程去執行任務,如果有多個任務需要等待上一個任務執行完成後,再去執行下一個任務。下面我們添加一個類來實現多線程並行執行任務,只要到了執行時間,不需要等待其它任務執行完畢就可以開始執行任務。

package com.instudio.ebay.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }
 
    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(20);
    }
}

只需添加上面的,就可以實現多個任務並行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章