Spring Boot 2.x實戰之定時任務調度

> 本文首發於個人網站:[Spring Boot 2.x實戰之定時任務調度](http://www.javaadu.online/?p=670)

在後端開發中,有些場景是需要使用定時任務的,例如:定時同步一批數據、定時清理一些數據,在Spring Boot中提供了`@Scheduled`註解就提供了定時調度的功能,對於簡單的、單機的調度方案是足夠了的。這篇文章準備用實際案例看下`@Scheduled`的用法。

## 開發實戰

1. 新建Spring Boot工程,主pom文件內容如下:

<code><project><modelversion>4.0.0/<modelversion><parent><groupid>org.springframework.boot/<groupid><artifactid>spring-boot-starter-parent/<artifactid><version>2.2.2.RELEASE/<version><relativepath> /<parent><groupid>online.javaadu.schedule/<groupid><artifactid>scheduledemo/<artifactid><version>0.0.1-SNAPSHOT/<version><name>scheduledemo/<name><description>Demo project for Spring Boot/<description><properties><java.version>1.8/<java.version>/<properties><dependencies><dependency><groupid>org.springframework.boot/<groupid><artifactid>spring-boot-starter/<artifactid>/<dependency><dependency><groupid>org.projectlombok/<groupid><artifactid>lombok/<artifactid><optional>true/<optional>/<dependency><dependency><groupid>org.springframework.boot/<groupid><artifactid>spring-boot-starter-test/<artifactid><scope>test/<scope><exclusions><exclusion><groupid>org.junit.vintage/<groupid><artifactid>junit-vintage-engine/<artifactid>/<exclusion>/<exclusions>/<dependency>/<dependencies><build><plugins><plugin><groupid>org.springframework.boot/<groupid><artifactid>spring-boot-maven-plugin/<artifactid>/<plugin>/<plugins>/<build>/<project>/<code>


2. 新建定時任務組件,使用`@Scheduled`註解修飾要調度的方法,在該方法中會打印當前的時間。

<code>package online.javaadu.schedule.scheduledemo;      import org.slf4j.Logger;   import org.slf4j.LoggerFactory;   import org.springframework.scheduling.annotation.Scheduled;   import org.springframework.stereotype.Component;      import java.text.SimpleDateFormat;   import java.util.Date;      @Component   public class ScheduledTasks {          private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);          private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");        //第一次執行之前延後10秒鐘;後續每隔5秒執行1次       @Scheduled(fixedRate = 5000, initialDelay = 10000)       public void reportCurrentTime() {           log.info("The time is now {}", dateFormat.format(new Date()));       }   }/<code>


3. 在ScheduledemoApplication中開啟定時調度能力——即開啟`@Scheduled`註解的定時調度功能,並在系統剛起來的時候打印一行日誌,用來體現上一步中的initialDelay的作用。

<code>package online.javaadu.schedule.scheduledemo;      import org.slf4j.Logger;   import org.slf4j.LoggerFactory;   import org.springframework.boot.SpringApplication;   import org.springframework.boot.autoconfigure.SpringBootApplication;   import org.springframework.scheduling.annotation.EnableScheduling;      import java.text.SimpleDateFormat;   import java.util.Date;      @SpringBootApplication   @EnableScheduling   public class ScheduledemoApplication {      private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);   private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");      public static void main(String[] args) {   SpringApplication.run(ScheduledemoApplication.class, args);   log.info("---The time is now {}", dateFormat.format(new Date()));   }      }/<code>


4. 點擊運行後,該demo的運行結果如下,可以看出,23:15:35應用啟動,過了10秒鐘定時調度任務才開始執行,然後是每隔5秒鐘打印一次時間。


Spring Boot 2.x實戰之定時任務調度

分析解釋

我們一起來看下`@Scheduled`註解的源碼,看看除了上面的例子裡提供的案例,該註解還有哪些功能呢?

  • cron,可以支持更復雜的時間複雜度
  • zone,解析cron表達式的時候解析時區
  • fixedDelay(和fixedDelayString),兩次調度之間需要加一個固定的延遲
  • fixedRate(和fixedRateString),沒隔多久需要調度一次
  • initialDelay(和initialDelayString),第一次調度之前需要延遲多久
<code>@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Repeatable(Schedules.class)public @interface Scheduled {/** * 特殊的cron表達式,如果設置成這個值,則表示將定時調度器關閉,不再調度。 */String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED;/** * cron表達式,可以支持複雜的定時調度需求 */String cron() default "";/** * cron表達式解析的時候,解析依賴的時區 */String zone() default "";/** * 兩次調度觸發之間暫停的毫秒數,Long類型 */long fixedDelay() default -1;/** * 兩次調度觸發之間暫停的毫秒數,String類型 */String fixedDelayString() default "";/** * 每隔幾毫秒調度一次 */long fixedRate() default -1;/** * 每隔幾毫秒調度一次,String類型 */String fixedRateString() default "";/** * 第一次執行之前,延遲多少毫秒 */long initialDelay() default -1;/** * 第一次執行之前,延遲多少毫秒,String類型 */String initialDelayString() default "";}/<code>

1. [https://spring.io/guides/gs/scheduling-tasks/](https://spring.io/guides/gs/scheduling-tasks/)

2. 《Spring Boot實戰》


Spring Boot 2.x系列

1. [Spring Boot 2.x實戰之StateMachine](http://www.javaadu.online/?p=655)



本號專注於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。


分享到:


相關文章: