springboot通過註解、接口創建定時任務詳解

項目中經常會用到定時任務,有的人在用quartz,有的人可能自己搭建瞭一套調度平臺,springboot對於定任務的支持,讓定時任務的創建變得簡單,今天來說說springboot中定時任務的創建。

springboot中定時任務的創建

springboot定時任務的創建,這裡就主要說兩種方式

  • 通過註解創建
  • 通過springboot中提供的接口實現

springboot通過註解創建定時任務

首先引入pom

在類上主要用到瞭@EnableScheduling註解,都在org.springframework:spring-context這個包下

就引入org.springframework:spring-context這個包就可以使用瞭

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
</dependency>

直接上代碼來一個栗子

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @createdTime: 2020/4/7 16:00.
 * @version: 1.0 .
 */
//在類型使用@EnableScheduling來開啟定時任務
@Component
@EnableScheduling
public class TestTask {

    private static ThreadLocal<SimpleDateFormat> dateFormat =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));


    //在方法上使用@Scheduled註解來創建具體的定時任務
    @Scheduled(cron = "0/10 * * * * ?")
    private void task1() {
        System.err.println("執行定時任務瞭,執行時間為:" + dateFormat.get().format(new Date()));
    }
}

看下執行結果:

在類上使用瞭@EnableScheduling來開啟定時任務,使用瞭@Component是為瞭註入到spring容器中,這裡不用@Component會不會註入我倒沒有試過,有試過的小夥伴可以說一下。

在具體需要定時執行的方法上,使用 @Scheduled註解,這個註解裡面的參數有很多種,我這用瞭cron表達式,這裡介紹下這個註解的參數吧

@Scheduled註解的各個參數

  • cron

使用方式:@Scheduled(cron = “0/10 * * * * ?”)

源碼定義:String cron() default “”;

說明:cron表達式,就是我們日常用的cron,具體的就不貼出來瞭

  • zone

使用方式:@Scheduled(zone = “GMT+08:00”)

源碼定義:String zone() default “”;

說明:時區,cron表達式會基於這個時區解析,默認為空,會取應用所在服務器的時區,一般不填就可以瞭,和jdk中TimeZone用的是統一體系,就不具體說瞭

  • fixedDelay

使用方式:@Scheduled(fixedDelay = 1)

源碼定義:long fixedDelay() default -1;

說明:上次執行完瞭,相隔多長時間以後再執行,單位是毫秒

  • fixedDelayString

使用方式:

@Scheduled(fixedDelayString = “1”)

@Scheduled(fixedDelayString = “${配置文件裡面的值}”)

源碼定義:String fixedDelayString() default “”;

說明:和fixedDelay一樣,是string類型的可以填數,單位是毫秒,可以使用配置文件裡面的值,使用方法和spring註入配置文件的使用方式一樣

  • fixedRate

使用方式:@Scheduled(fixedRate = 1)

源碼定義:long fixedRate() default -1;

說明:上次執行開始後,相隔多長時間以後再執行,單位是毫秒

  • fixedRateString

使用方式:

@Scheduled(fixedRateString = “1”)

@Scheduled(fixedRateString = “${配置文件裡面的值}”)

源碼定義:String fixedRateString() default “”;

說明:和fixedRate一樣,,是string類型的可以填數,單位是毫秒,可以使用配置文件裡面的值,使用方法和spring註入配置文件的使用方式一樣

  • initialDelay

使用方式:@Scheduled(initialDelay = 1)

源碼定義:long initialDelay() default -1;

說明:上第一次執行後,相隔多長時間以後再執行,單位是毫秒

  • initialDelayString

使用方式:

@Scheduled(initialDelayString = “1”)

@Scheduled(initialDelayString = “${配置文件裡面的值}”)

源碼定義:String initialDelayString() default “”;

說明:和initialDelay一樣,,是string類型的可以填數,單位是毫秒,可以使用配置文件裡面的值,使用方法和spring註入配置文件的使用方式一樣

springboot通過註接口創建定時任務

通過接口創建定時,就會比較靈活,定時cron表達式就不用寫死在代碼的註解上瞭,可以通過存儲到數據庫等存儲系統中,在接口中來獲取這個配置的表達式,這樣可以實現一個簡易的任務調度平臺,通過數據庫配置就可以管理定時任務的執行

實現接口SchedulingConfigurer

主要用的是這個接口SchedulingConfigurer,他是org.springframework.scheduling.annotation.SchedulingConfigurer這個包路徑,其實也是都在org.springframework:spring-context這個包下

就引入org.springframework:spring-context這個包就可以使用瞭

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
</dependency>

主要方法

復寫configureTasks方法,這個方法通過ScheduledTaskRegistrar來添加定時任務,大致看方法,入參基本是一個線程對象,後面那個參數和註解裡面一樣,主要有cron表達式,delay上次執行完瞭,相隔多長時間以後再執行,initial什麼的就不一一贅述瞭

直接上代碼來一個栗子

import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.config.Task;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @createdTime: 2020/4/7 18:33.
 * @version: 1.0 .
 */
@Component
@EnableScheduling
public class TestTask2 implements SchedulingConfigurer {

    private static ThreadLocal<SimpleDateFormat> dateFormat =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    /**
     * Callback allowing a {@link TaskScheduler
     * TaskScheduler} and specific {@link Task Task}
     * instances to be registered against the given the {@link ScheduledTaskRegistrar}.
     *
     * @param taskRegistrar the registrar to be configured.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        System.err.println("假裝從數據庫中獲取到瞭配置好的定時任務執行計劃");
        String cron = "0/10 * * * * ?";
        taskRegistrar.addCronTask(() -> {
            System.err.println("接口定時任務執行定時任務瞭,執行時間為:" + dateFormat.get().format(new Date()));
        },cron);
    }
}

這裡通過重寫configureTasks方法,使用ScheduledTaskRegistrar對象來創建定時任務,然後表達式可以從數據庫等地方讀取,演示時候就不寫那塊代碼瞭,這樣可以很簡單的實現出來一個簡單的任務調度平臺
看下執行結果:

springboot創建定時任務就為大傢說到這裡,歡迎大傢來交流,指出文中一些說錯的地方,讓我加深認識。

總結

到此這篇關於springboot通過註解、接口創建定時任務的文章就介紹到這瞭,更多相關springboot創建定時任務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: