Try   HackMD

六角鼠年鐵人賽 Week 31 - Spring Boot - Schedule Works

大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai

Douglas MacArthur

Old soldiers never die. They just fade away.

主題

程式設計的用意就是在於處理重複性高、須定時或不定時的作業項目,從而替人類節省許多時間與精力,對於工程師來說提供 API 就算是一個處理不定時作業的方式。

但定時的部份我們該如何處理呢??

Spring 作為一個強大的 Java EE 框架,當然也有提供定時作業的套件可以使用了。

TimerTask 和 CronJob 是以往大家常見用於 Java 設計定時執行程式時候的套件。
在 Spring 中將會使用 @Scheduled 來執行所有的定時作業程式。

@Scheduled

在 @Scheduled 中我們可以設定的參數包含以下:

參數 說明 範例用法
fixedDelay 單位 毫秒;設定間隔,程式會在上一次執行後,經過設定時間再次執行 fixedDelay = 1000 每執行一次後停1秒
fixedRate 單位 毫秒;設定頻率,程式會在第一次啟動後,以固定的頻率執行,無論前一次執行是否結束,都會強制執行新的一輪 fixedRate = 1000 每秒執行一次
initialDelay 單位 毫秒;設定在經過設定時間後執行 initialDelay = 1000 1秒後開始執行
cron CronJob 的時間設定方式;"秒 分 時 每月特定日期 月 每週特定星期",前五項可用 星號* 表示該設定的所有單位都允許;每周特定星期必須使用 問號? 1. "5 * * * * ?" 每5秒執行一次    2. "* * * 5 * ?" 每月5號執行一次
Zone 時區設定 Zone="Asia/Taipei" 將時區設定為台灣 台北時間
fixedDelayString 取自設定在 XML 中的參數作為 fixedDelay fixedDelayString = "${fixedDelay.in.milliseconds}"
fixedRateString 取自設定在 XML 中的參數作為 fixedRate fixedRateString = "${fixedRate.in.milliseconds}"
cron (XML) 取自設定在 XML 中的參數作為 cron cron = "${cron.expression}"

設定在 XML 中

<!-- Configure the scheduler -->
<task:scheduler id="myScheduler" pool-size="10" />
 
<!-- Configure parameters -->
<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="beanA" method="methodA" 
      fixed-delay="5000" initial-delay="1000" />
    <task:scheduled ref="beanB" method="methodB" 
      fixed-rate="5000" />
    <task:scheduled ref="beanC" method="methodC" 
      cron="*/5 * * * * MON-FRI" />
</task:scheduled-tasks>

設定在 Class 中

Scheduler.java

package kai.com.scheduledTask; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class Scheduler { @Scheduled(fixedDelay = 1000) public void fixedDelaySch() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date now = new Date(); String strDate = sdf.format(now); System.out.println("Fixed Delay scheduler:: " + strDate); } @Scheduled(fixedRate = 1000) public void fixedRateSch() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date now = new Date(); String strDate = sdf.format(now); System.out.println("Fixed Rate scheduler:: " + strDate); } @Scheduled(cron = "10 * * * * ?") public void cronJobSch() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date now = new Date(); String strDate = sdf.format(now); System.out.println("Java cron job expression:: " + strDate); } }

程式啟動一併執行 Schedule Works

切記勿必要在 springbootApplicationStarter.java 中增加 @EnableScheduling 的設定,這樣 app 才會在啟動的同時去執行 Schedule works

package kai.com; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // <-- 一定要加上,才會執行所有設定好的 Schedule works public class springbootApplicationStarter { public static void main(String [] args){ SpringApplication.run(springbootApplicationStarter.class,args); } }

範例成果

這期簡單介紹了如何使用 Spring 達到定時作業的處理方式,多少可以幫忙工程師減輕一些設定上的麻煩。

首頁 Kai 個人技術 Hackmd

tags: Spring Boot,w3HexSchool