SpringBoot(十四)_springboot使用內置定時任務Scheduled的使用(一)


為什么使用定時?

日常工作中,經常會用到定時任務,比如各種統計,並不要求實時性。此時可以通過提前設置定時任務先把數據跑出來,后續處理起來更方便. 本篇文章主要介紹 springboot內置定時任務。

實戰演示

1、pom文件

pom 包里面只需要引入 Spring Boot Starter 包即可,Spring Boot Starter 包中已經內置了定時的方法。我這里方便演示,增加了lombok

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

2、啟動類開啟定時

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }
}

3、創建定時任務實現類

這里並沒有直接在類中寫cron語句,而是寫到了配置文件中。一般實際項目中這樣寫。

3.1、ScheduledTask 類
/**
 * @author: curry
 * @Date: 2018/10/10
 */
@Component
@Slf4j
public class ScheduledTask {
    @Scheduled(cron = "${job.schedule}")
    private void process1() {
        log.info("start");
    }

}
3.2 application.properties
job.schedule = */5 * * * * ? 

4、執行結果

2018-10-10 22:48:55.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:00.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:05.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:10.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:15.001  [pool-1-thread-1] demo.ScheduledTask     : start

corn 語法說明

cron 每位的含義

cron 一共有 7 位,最后一位是年,Spring Boot 定時方案中只需要設置 6 位即可:

- 第一位,表示秒,取值 0-59;
- 第二位,表示分,取值 0-59;
- 第三位,表示小時,取值 0-23;
- 第四位,日期天/日,取值 1-31;
- 第五位,日期月份,取值 1-12;
- 第六位,星期,取值 1-7,星期一、星期二…;
注:不是第1周、第2周的意思,另外:1表示星期天,2表示星期一。
- 第七位,年份,可以留空,取值 1970-2099。

cron 符號含義

(*)星號:可以理解為每的意思,每秒、每分、每天、每月、每年……。
(?)問號:問號只能出現在日期和星期這兩個位置,表示這個位置的值不確定,每天 12 點執行,所以第六位星期的位置是不需要關注的,就是不確定的值。同時,日期和星期是兩個相互排斥的元素,通過問號來表明不指定值。
(-)減號:表達一個范圍,如在小時字段中使用“10-12”,則表示從 10~12 點,即 10、11、12。
(,)逗號:表達一個列表值,如在星期字段中使用“1,2,4”,則表示星期天、星期一、星期三。
(/)斜杠:如 x/y,x 是開始值,y 是步長,比如在第一位(秒) 0/15 就是,從 0 秒開始,每 15 秒,最后就是 0、15、30、45、60,另 */y,等同於 0/y。

舉個栗子

0 0 1 * * ?     每天 1 點執行。
0 5 1 * * ?     每天 1 點 5 分執行。
0-5 * * * * ?   每分鍾的0/1/2/3/4/5 秒執行
0 5/10 1 * * ?  每天 1 點的 5 分、15 分、25 分、35 分、45 分、55 分這幾個時間點執行。
0 5 1 ? * 1     每周星期天,1點5分 執行,注:1 表示星期天。  
0 10 3 ? * 1#3  每個月的第 三 個星期,星期天執行,# 號只能出現在星期的位置。

fixedRate 說明

這個日常工作中很少用到,這里不做詳細介紹

@Scheduled(fixedRate = 6000) :上一次開始執行時間點之后 6 秒再執行。
@Scheduled(fixedDelay = 6000) :上一次執行完畢時間點之后 6 秒再執行。
@Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲 1 秒后執行,之后按 fixedRate 的規則每 6 秒執行一次。

總結

其實,使用內置的定時任務還是很方便的,需要注意的是,它是單線程的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM