# 六角鼠年鐵人賽 Week 31 - Spring Boot - Schedule Works ==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai== ## Douglas MacArthur :::info 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 中 ```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** ```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 ```java= 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); } } ``` ## 範例成果 ![](https://i.imgur.com/1yfL15I.png) :::danger 這期簡單介紹了如何使用 Spring 達到定時作業的處理方式,多少可以幫忙工程師減輕一些設定上的麻煩。 ::: 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Spring Boot`,`w3HexSchool`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up