--- tags: Java, Spring --- # Spring - @Scheduled 顧名思義,就是排程囉! 固定時間執行特定事情、特定方法這樣 使用方法是這樣的: ```java= @Component public class ScheduledTasks { private static final Logger log = org.slf4j.LoggerFactory.getLogger(ScheduledTasks.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); /** * 每五秒執行一次 reportCurrentTime() 方法 */ @Scheduled(fixedDelay = 5000) public void reportCurrentTime() { log.info("The time is now {}", dateFormat.format(new Date())); } } ``` 再來到 main() 方法中加入 @EnableScheduling 這個 Annotation ```java= @SpringBootApplication @EnableScheduling public class SchedulingTasksApplication { public static void main(String[] args) { SpringApplication.run(SchedulingTasksApplication.class, args); } } ``` 執行下去就會開始每五秒打出現在的時間了 --- 上面的範例其實就是幾個重點 1. 使用 @Scheduled Annotation 可以定時執行指定方法 2. 必須要 main() 方法中定義 @EnableScheduling Annotation 才會開啟排程,沒有定義這個,@Scheduled 寫得再多都不會有任何進入排程 > The @EnableScheduling annotation ensures that a background task executor is created. Without it, nothing gets scheduled. 接下來介紹詳細的定義吧! @Scheduled 接收以下幾種參數 - cron 類似我們在 Linux 常用到的 crontab 那種表示,但不完全依樣 固定六個值:秒(0-59) 分(0-59) 時(0-23) 日(1-31) 月(1-12) 週(1-7) 日與週互斥, 當想要用日的時候,週的值必須是 ? 當想要用週的時候,日的值必須是 ? ```java= @Scheduled(cron = "0 30 10 ? * 1", zone = "Asia/Taipei") ``` - zone 指定時區,因為不同的地區可能會因為時區的不同而有沒想到的結果,所以可以使用 zone 來固定時區。通常是跟 cron 一起使用! ```java= @Scheduled(cron = "0 30 10 ? * 1, zone = "Asia/Taipei") ``` - fixedDelay 定時間不斷重複執行,若是上次沒有執行完,就不會執行,會等上次執行完再執行 ( 單位毫秒 ) ```java= @Scheduled(fixedDelay = 3000) ``` - fixedDelayString 定時間不斷重複執行,若是上次沒有執行完,就不會執行,會等上次執行完再執行 ( 單位毫秒 ) ```java= @Scheduled(fixedDelayString = "3000") ``` - fixedRate 定時間不斷重複執行,它是不會等上一次執行完的,如果我們定三秒執行一次,結果執行指定方法要花五秒,就會有重複執行方法的可能 ( 單位毫秒 ) ```java= @Scheduled(fixedRate = 3000) ``` - fixedRateString 定時間不斷重複執行,它是不會等上一次執行完的,如果我們定三秒執行一次,結果執行指定方法要花五秒,就會有重複執行方法的可能 ( 單位毫秒 ) ```java= @Scheduled(fixedRateString = "3000") ``` - initialDelay 初始 Delay 時間,第一次會等待的時間,之後就會用 fixedDelay 的或 fixedRate 定義的了 ```java= @Scheduled(fixedRate = 3000, initialDelay = 10000) ``` - initialDelayString 初始 Delay 時間,第一次會等待的時間,之後就會用 fixedDelay 的或 fixedRate 定義的了 ```java= @Scheduled(fixedRate = 3000, initialDelayString = "10000") ```
×
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