@Scheduled注解的使用這里不詳細(xì)說明斩个,直接對8個(gè)參數(shù)進(jìn)行講解书妻。
參數(shù)詳解
1. cron
該參數(shù)接收一個(gè)cron表達(dá)式
获高,cron表達(dá)式
是一個(gè)字符串哈肖,字符串以5或6個(gè)空格隔開,分開共6或7個(gè)域念秧,每一個(gè)域代表一個(gè)含義淤井。
cron表達(dá)式語法
[秒] [分] [小時(shí)] [日] [月] [周] [年]
注:[年]不是必須的域,可以省略[年],則一共6個(gè)域
序號 | 說明 | 必填 | 允許填寫的值 | 允許的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 時(shí) | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12 / JAN-DEC | , - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , - * ? / L # |
7 | 年 | 否 | 1970-2099 | , - * / |
通配符說明:
-
*
表示所有值币狠。 例如:在分的字段上設(shè)置 *,表示每一分鐘都會觸發(fā)游两。 -
?
表示不指定值。使用的場景為不需要關(guān)心當(dāng)前設(shè)置這個(gè)字段的值漩绵。例如:要在每月的10號觸發(fā)一個(gè)操作贱案,但不關(guān)心是周幾,所以需要周位置的那個(gè)字段設(shè)置為”?” 具體設(shè)置為 0 0 0 10 * ? -
-
表示區(qū)間止吐。例如 在小時(shí)上設(shè)置 “10-12”,表示 10,11,12點(diǎn)都會觸發(fā)宝踪。 -
,
表示指定多個(gè)值,例如在周字段上設(shè)置 “MON,WED,FRI” 表示周一碍扔,周三和周五觸發(fā) -
/
用于遞增觸發(fā)肴沫。如在秒上面設(shè)置”5/15” 表示從5秒開始,每增15秒觸發(fā)(5,20,35,50)蕴忆。 在日字段上設(shè)置’1/3’所示每月1號開始,每隔三天觸發(fā)一次悲幅。 -
L
表示最后的意思套鹅。在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份汰具,如果是二月還會依據(jù)是否是潤年[leap]), 在周字段上表示星期六卓鹿,相當(dāng)于”7”或”SAT”。如果在”L”前加上數(shù)字留荔,則表示該數(shù)據(jù)的最后一個(gè)吟孙。例如在周字段上設(shè)置”6L”這樣的格式,則表示“本月最后一個(gè)星期五” -
W
表示離指定日期的最近那個(gè)工作日(周一至周五). 例如在日字段上置”15W”,表示離每月15號最近的那個(gè)工作日觸發(fā)聚蝶。如果15號正好是周六杰妓,則找最近的周五(14號)觸發(fā), 如果15號是周未,則找最近的下周一(16號)觸發(fā).如果15號正好在工作日(周一至周五)碘勉,則就在該天觸發(fā)巷挥。如果指定格式為 “1W”,它則表示每月1號往后最近的工作日觸發(fā)。如果1號正是周六验靡,則將在3號下周一觸發(fā)倍宾。(注,”W”前只能設(shè)置具體的數(shù)字,不允許區(qū)間”-“)胜嗓。 -
#
序號(表示每月的第幾個(gè)周幾)高职,例如在周字段上設(shè)置”6#3”表示在每月的第三個(gè)周六.注意如果指定”#5”,正好第五周沒有周六,則不會觸發(fā)該配置(用在母親節(jié)和父親節(jié)再合適不過了) 辞州;小提示:’L’和 ‘W’可以一組合使用怔锌。如果在日字段上設(shè)置”LW”,則表示在本月的最后一個(gè)工作日觸發(fā);周字段的設(shè)置,若使用英文字母是不區(qū)分大小寫的产禾,即MON與mon相同排作。
示例
每隔5秒執(zhí)行一次:*/5 * * * * ?
每隔1分鐘執(zhí)行一次:0 */1 * * * ?
每天23點(diǎn)執(zhí)行一次:0 0 23 * * ?
每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?
每月1號凌晨1點(diǎn)執(zhí)行一次:0 0 1 1 * ?
每月最后一天23點(diǎn)執(zhí)行一次:0 0 23 L * ?
每周星期六凌晨1點(diǎn)實(shí)行一次:0 0 1 ? * L
在26分、29分亚情、33分執(zhí)行一次:0 26,29,33 * * * ?
每天的0點(diǎn)妄痪、13點(diǎn)、18點(diǎn)楞件、21點(diǎn)都執(zhí)行一次:0 0 0,13,18,21 * * ?
cron表達(dá)式使用占位符
另外衫生,cron
屬性接收的cron表達(dá)式
支持占位符。eg:
配置文件:
time:
cron: */5 * * * * *
interval: 5
每5秒執(zhí)行一次:
@Scheduled(cron="${time.cron}")
void testPlaceholder1() {
System.out.println("Execute at " + System.currentTimeMillis());
}
@Scheduled(cron="*/${time.interval} * * * * *")
void testPlaceholder2() {
System.out.println("Execute at " + System.currentTimeMillis());
}
2. zone
時(shí)區(qū)土浸,接收一個(gè)java.util.TimeZone#ID
罪针。cron表達(dá)式
會基于該時(shí)區(qū)解析。默認(rèn)是一個(gè)空字符串黄伊,即取服務(wù)器所在地的時(shí)區(qū)泪酱。比如我們一般使用的時(shí)區(qū)Asia/Shanghai
。該字段我們一般留空还最。
3. fixedDelay
上一次執(zhí)行完畢時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行墓阀。如:
@Scheduled(fixedDelay = 5000) //上一次執(zhí)行完畢時(shí)間點(diǎn)之后5秒再執(zhí)行
4. fixedDelayString
與 3. fixedDelay
意思相同,只是使用字符串的形式拓轻。唯一不同的是支持占位符斯撮。如:
@Scheduled(fixedDelayString = "5000") //上一次執(zhí)行完畢時(shí)間點(diǎn)之后5秒再執(zhí)行
占位符的使用(配置文件中有配置:time.fixedDelay=5000):
@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {
System.out.println("Execute at " + System.currentTimeMillis());
}
運(yùn)行結(jié)果:
5. fixedRate
上一次開始執(zhí)行時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行。如:
@Scheduled(fixedRate = 5000) //上一次開始執(zhí)行時(shí)間點(diǎn)之后5秒再執(zhí)行
6. fixedRateString
與 5. fixedRate
意思相同扶叉,只是使用字符串的形式勿锅。唯一不同的是支持占位符。
7. initialDelay
第一次延遲多長時(shí)間后再執(zhí)行枣氧。如:
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延遲1秒后執(zhí)行溢十,之后按fixedRate的規(guī)則每5秒執(zhí)行一次
8. initialDelayString
與 7. initialDelay
意思相同,只是使用字符串的形式作瞄。唯一不同的是支持占位符茶宵。
That's all ! Thanks for reading.
附:
截至spring-context-4.3.14.RELEASE
的源碼
/**
* 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
* @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
* @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;
String initialDelayString() default "";
}
相關(guān)鏈接
Spring - Quartz - cronExpression中問號(?)的解釋
在線Cron表達(dá)式生成器
推薦閱讀
Spring Cloud 進(jìn)階玩法
統(tǒng)一異常處理介紹及實(shí)戰(zhàn)
分布式鎖可以這么簡單?
Spring Cloud Stream 進(jìn)階配置——使用延遲隊(duì)列實(shí)現(xiàn)“定時(shí)關(guān)閉超時(shí)未支付訂單”
Spring Cloud Stream 進(jìn)階配置——高可用(二)——死信隊(duì)列