javascript
SpringBoot之使用Scheduled做定时任务
定時任務有好多開源框架比如Quartz,@Scheduled是Spring的一個定時任務注解,通過注解配置就能夠輕量級的定時任務,簡單方便。
一、@Scheduled注解介紹
這里先貼上@Scheduled注解。然后下面的這幾個屬性的介紹。
* Copyright 2002-2018 the original author or authors.package org.springframework.scheduling.annotation;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** An annotation that marks a method to be scheduled. Exactly one of* the {@link #cron()}, {@link #fixedDelay()}, or {@link #fixedRate()}* attributes must be specified.** <p>The annotated method must expect no arguments. It will typically have* a {@code void} return type; if not, the returned value will be ignored* when called through the scheduler.** <p>Processing of {@code @Scheduled} annotations is performed by* registering a {@link ScheduledAnnotationBeanPostProcessor}. This can be* done manually or, more conveniently, through the {@code <task:annotation-driven/>}* element or @{@link EnableScheduling} annotation.** <p>This annotation may be used as a <em>meta-annotation</em> to create custom* <em>composed annotations</em> with attribute overrides.** @author Mark Fisher* @author Dave Syer* @author Chris Beams* @since 3.0* @see EnableScheduling* @see ScheduledAnnotationBeanPostProcessor* @see Schedules*/ @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled {/*** A cron-like expression, extending the usual UN*X definition to include* triggers on the second as well as minute, hour, day of month, month* and day of week. e.g. {@code "0 * * * * MON-FRI"} means once per minute on* weekdays (at the top of the minute - the 0th second).* @return an expression that can be parsed to a cron schedule* @see org.springframework.scheduling.support.CronSequenceGenerator*/String cron() default "";/*** A time zone for which the cron expression will be resolved. By default, this* attribute is the empty String (i.e. the server's local time zone will be used).* @return a zone id accepted by {@link java.util.TimeZone#getTimeZone(String)},* or an empty String to indicate the server's default time zone* @since 4.0* @see org.springframework.scheduling.support.CronTrigger#CronTrigger(String, java.util.TimeZone)* @see java.util.TimeZone*/String zone() default "";/*** Execute the annotated method with a fixed period in milliseconds between the* end of the last invocation and the start of the next.* @return the delay in milliseconds*/long fixedDelay() default -1;/*** Execute the annotated method with a fixed period in milliseconds between the* end of the last invocation and the start of the next.* @return the delay in milliseconds as a String value, e.g. a placeholder* or a {@link java.time.Duration#parse java.time.Duration} compliant value* @since 3.2.2*/String fixedDelayString() default "";/*** Execute the annotated method with a fixed period in milliseconds between* invocations.* @return the period in milliseconds*/long fixedRate() default -1;/*** Execute the annotated method with a fixed period in milliseconds between* invocations.* @return the period in milliseconds as a String value, e.g. a placeholder* or a {@link java.time.Duration#parse java.time.Duration} compliant value* @since 3.2.2*/String fixedRateString() default "";/*** Number of milliseconds to delay before the first execution of a* {@link #fixedRate()} or {@link #fixedDelay()} task.* @return the initial delay in milliseconds* @since 3.2*/long initialDelay() default -1;/*** Number of milliseconds to delay before the first execution of a* {@link #fixedRate()} or {@link #fixedDelay()} task.* @return the initial delay in milliseconds as a String value, e.g. a placeholder* or a {@link java.time.Duration#parse java.time.Duration} compliant value* @since 3.2.2*/String initialDelayString() default "";} View Codecron屬性
??? 這是一個時間表達式,可以通過簡單的配置就能完成各種時間的配置,我們通過CRON表達式幾乎可以完成任意的時間搭配,它包含了六或七個域:
??? Seconds : 可出現", - * /"四個字符,有效范圍為0-59的整數
??? Minutes : 可出現", - * /"四個字符,有效范圍為0-59的整數
??? Hours : 可出現", - * /"四個字符,有效范圍為0-23的整數
??? DayofMonth : 可出現", - * / ? L W C"八個字符,有效范圍為0-31的整數
??? Month : 可出現", - * /"四個字符,有效范圍為1-12的整數或JAN-DEc
??? DayofWeek : 可出現", - * / ? L C #"四個字符,有效范圍為1-7的整數或SUN-SAT兩個范圍。1表示星期天,2表示星期一, 依次類推
??? Year : 可出現", - * /"四個字符,有效范圍為1970-2099年
??? "0 0 12 * * ?"??? 每天中午十二點觸發
??? "0 15 10 ? * *"??? 每天早上10:15觸發
??? "0 15 10 * * ?"??? 每天早上10:15觸發
??? "0 15 10 * * ? *"??? 每天早上10:15觸發
??? "0 15 10 * * ? 2005"??? 2005年的每天早上10:15觸發
??? "0 * 14 * * ?"??? 每天從下午2點開始到2點59分每分鐘一次觸發
??? "0 0/5 14 * * ?"??? 每天從下午2點開始到2:55分結束每5分鐘一次觸發
??? "0 0/5 14,18 * * ?"??? 每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發
??? "0 0-5 14 * * ?"??? 每天14:00至14:05每分鐘一次觸發
??? "0 10,44 14 ? 3 WED"??? 三月的每周三的14:10和14:44觸發
??? "0 15 10 ? * MON-FRI"??? 每個周一、周二、周三、周四、周五的10:15觸發
fixedRate屬性
??? 上一個調用開始后再次調用的延時(不用等待上一次調用完成),這樣就會存在重復執行的問題,所以不是建議使用,但數據量如果不大時在配置的間隔時間內可以執行完也是可以使用的。
fixedDelay屬性
??? 該屬性的功效與上面的fixedRate則是相反的,配置了該屬性后會等到方法執行完成后延遲配置的時間再次執行該方法。
initialDelay屬性
??? 該屬性跟上面的fixedDelay、fixedRate有著密切的關系,為什么這么說呢?該屬性的作用是第一次執行延遲時間,只是做延遲的設定,并不會控制其他邏輯,所以要配合fixedDelay或者fixedRate來使用。
二、@Scheduled注解實例
package com.example.demo;import java.text.SimpleDateFormat; import java.util.Date;import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;@Component public class SchedulerTask {SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");@Scheduled(fixedRate = 10000)public void timerRate() {System.out.println(dateFormat.format(new Date()));}//第一次延遲1秒執行,當執行完后2秒再執行@Scheduled(initialDelay = 1000, fixedDelay = 2000)public void timerInit() {System.out.println("init : "+dateFormat.format(new Date()));}//每天21點41分50秒執行@Scheduled(cron = "50 41 21 * * ?")public void timerCron() {System.out.println("current time : "+ dateFormat.format(new Date()));} }代碼都使用了上了的@Scheduled屬性。下圖是執行打印的日志信息,timerInit方法是每隔2秒執行,timerCron設置在21點41分50秒執行,timerRate是每隔10秒執行。
三、添加@EnableScheduling注解
上面的定時任務并不能執行,還需要一步,需要設置開啟定時任務,這個也很簡單,只需在main方法上加上@EnableScheduling注解即可。
package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling;@EnableScheduling @SpringBootApplication public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);} }?
總結
以上是生活随笔為你收集整理的SpringBoot之使用Scheduled做定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot(十二)_sprin
- 下一篇: 洛谷P3616 富金森林公园