javascript
Spring Boot 定时任务
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
本文主要介紹了Spring Boot中使用@Scheduled創(chuàng)建定時(shí)任務(wù)。我們?cè)诰帉?xiě)Spring Boot應(yīng)用中經(jīng)常會(huì)遇到這樣的場(chǎng)景,比如:我需要定時(shí)地發(fā)送一些短信、郵件之類(lèi)的操作,也可能會(huì)定時(shí)添加或者同步一些數(shù)據(jù)等。
在Spring Boot中編寫(xiě)定時(shí)任務(wù)是非常簡(jiǎn)單的事情。
①在springboot啟動(dòng)上面加入?@EnableScheduling注釋,
@SpringBootApplication @EnableScheduling public class SpringBootTaskApplication {public static void main(String[] args) {SpringApplication.run(SpringBootTaskApplication.class, args);} }②編寫(xiě)類(lèi)和方法。我們?cè)谖覀冋嬲枰獔?zhí)行的方法上添加了@Scheduled標(biāo)注,表示這個(gè)方法是需要定時(shí)執(zhí)行的。 @Scheduled注解的方法不能有返回值,并且不能有形參
package com.example.task.task;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;import java.text.SimpleDateFormat; import java.util.Date;/*** Created by ningcs on 17/3/27.*/@Component public class ScheduledTasks {private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private Integer count0 = 1;private Integer count1 = 1;private Integer count2 = 1;/*** 只需在這里調(diào)用service即可。** 每隔十秒進(jìn)行一次*/@Scheduled(cron ="*/10 * * * * *")public void reportCurrentTime() throws InterruptedException {logger.info("業(yè)務(wù)層代碼");logger.info(String.format("---第%s次執(zhí)行,當(dāng)前時(shí)間為:%s", count0++, dateFormat.format(new Date())));}/*** 只需在這里調(diào)用service即可。** 每隔1秒進(jìn)行一次*/@Scheduled(fixedRate=1000)public void getCurrentTime() throws InterruptedException {logger.info("1秒執(zhí)行一次");logger.info(String.format("---第%s次執(zhí)行,當(dāng)前時(shí)間為:%s", count0++, dateFormat.format(new Date())));}/*** 只需在這里調(diào)用service即可。** 每隔1秒進(jìn)行一次*/@Scheduled(fixedDelay=1000)public void CurrentTime() throws InterruptedException {Thread.sleep(5000);logger.info("隔5秒執(zhí)行一次");logger.info(String.format("---第%s次執(zhí)行,當(dāng)前時(shí)間為:%s", count0++, dateFormat.format(new Date())));}}注意說(shuō)明:
在@Scheduled標(biāo)注中,我們使用了三種方式來(lái)實(shí)現(xiàn)了同一個(gè)功能:每隔5秒鐘記錄一次當(dāng)前的時(shí)間:fixedRate = 5000表示每隔5000ms,Spring scheduling會(huì)調(diào)用一次該方法,不論該方法的執(zhí)行時(shí)間是多少fixedDelay = 5000表示當(dāng)方法執(zhí)行完畢5000ms后,Spring scheduling會(huì)再次調(diào)用該方法cron = "5 * * * * * *"提供了一種通用的定時(shí)任務(wù)表達(dá)式,這里表示每隔5秒執(zhí)行一次,更加詳細(xì)的信息可以參考cron表達(dá)式。*CRON表達(dá)式 含義"0 0 12 * * ?" 每天中午十二點(diǎn)觸發(fā)"0 15 10 ? * *" 每天早上10:15觸發(fā)"0 15 10 * * ?" 每天早上10:15觸發(fā)"0 15 10 * * ? *" 每天早上10:15觸發(fā)"0 15 10 * * ? 2005" 2005年的每天早上10:15觸發(fā)"0 * 14 * * ?" 每天從下午2點(diǎn)開(kāi)始到2點(diǎn)59分每分鐘一次觸發(fā)"0 0/5 14 * * ?" 每天從下午2點(diǎn)開(kāi)始到2:55分結(jié)束每5分鐘一次觸發(fā)"0 0/5 14,18 * * ?" 每天的下午2點(diǎn)至2:55和6點(diǎn)至6點(diǎn)55分兩個(gè)時(shí)間段內(nèi)每5分鐘一次觸發(fā)"0 0-5 14 * * ?" 每天14:00至14:05每分鐘一次觸發(fā)"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44觸發(fā)"0 15 10 ? * MON-FRI" 每個(gè)周一、周二、周三、周四、周五的10:15觸發(fā)*/CRON位數(shù)含義:
* 第一位,表示秒,取值0-59 * 第二位,表示分,取值0-59 * 第三位,表示小時(shí),取值0-23 * 第四位,日期天/日,取值1-31 * 第五位,日期月份,取值1-12 * 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思另外:1表示星期天,2表示星期一。 * 第7為,年份,可以留空,取值1970-2099cron中,還有一些特殊的符號(hào),含義如下:
(*)星號(hào):可以理解為每的意思,每秒,每分,每天,每月,每年... (?)問(wèn)號(hào):問(wèn)號(hào)只能出現(xiàn)在日期和星期這兩個(gè)位置,表示這個(gè)位置的值不確定,每天3點(diǎn)執(zhí)行,所以第六位星期的位置,我們是不需要關(guān)注的,就是不確定的值。同時(shí):日期和星期是兩個(gè)相互排斥的元素,通過(guò)問(wèn)號(hào)來(lái)表明不指定值。比如,1月10日,比如是星期1,如果在星期的位置是另指定星期二,就前后沖突矛盾了。 (-)減號(hào):表達(dá)一個(gè)范圍,如在小時(shí)字段中使用“10-12”,則表示從10到12點(diǎn),即10,11,12 (,)逗號(hào):表達(dá)一個(gè)列表值,如在星期字段中使用“1,2,4”,則表示星期一,星期二,星期四 (/)斜杠:如:x/y,x是開(kāi)始值,y是步長(zhǎng),比如在第一位(秒) 0/15就是,從0秒開(kāi)始,每15秒,最后就是0,15,30,45,60
?
在線(xiàn)Cron表達(dá)式生成器
http://cron.qqe2.com/
github地址:
https://github.com/ningcs/SpringBootTask
轉(zhuǎn)載于:https://my.oschina.net/u/2851681/blog/1439265
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 定时任务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编入门学习笔记 (十二)—— int
- 下一篇: Exchange 2016 批量添加X5