springboot創(chuàng)建定時任務(wù)

項目中經(jīng)常會用到定時任務(wù)旧巾,有的人在用quartz耸序,有的人可能自己搭建了一套調(diào)度平臺,springboot對于定任務(wù)的支持鲁猩,讓定時任務(wù)的創(chuàng)建變得簡單佑吝,今天來說說springboot中定時任務(wù)的創(chuàng)建。

springboot中定時任務(wù)的創(chuàng)建

springboot定時任務(wù)的創(chuàng)建绳匀,這里就主要說兩種方式

  • 通過注解創(chuàng)建
  • 通過springboot中提供的接口實現(xiàn)

springboot通過注解創(chuàng)建定時任務(wù)

首先引入pom

主要使用的注解

在類上主要用到了@EnableScheduling注解芋忿,都在org.springframework:spring-context這個包下
org.springframework:spring-context包

就引入org.springframework:spring-context這個包就可以使用了

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
</dependency>
直接上代碼來一個栗子
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @createdTime: 2020/4/7 16:00.
 * @version: 1.0 .
 */
//在類型使用@EnableScheduling來開啟定時任務(wù)
@Component
@EnableScheduling
public class TestTask {

    private static ThreadLocal<SimpleDateFormat> dateFormat =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));


    //在方法上使用@Scheduled注解來創(chuàng)建具體的定時任務(wù)
    @Scheduled(cron = "0/10 * * * * ?")
    private void task1() {
        System.err.println("執(zhí)行定時任務(wù)了,執(zhí)行時間為:" + dateFormat.get().format(new Date()));
    }
}

看下執(zhí)行結(jié)果:


執(zhí)行結(jié)果

在類上使用了@EnableScheduling來開啟定時任務(wù)疾棵,使用了@Component是為了注入到spring容器中戈钢,這里不用@Component會不會注入我倒沒有試過,有試過的小伙伴可以說一下是尔。
在具體需要定時執(zhí)行的方法上殉了,使用 @Scheduled注解,這個注解里面的參數(shù)有很多種拟枚,我這用了cron表達(dá)式薪铜,這里介紹下這個注解的參數(shù)吧

@Scheduled注解的各個參數(shù)
  • cron
    使用方式:@Scheduled(cron = "0/10 * * * * ?")
    源碼定義:String cron() default "";
    說明:cron表達(dá)式,就是我們?nèi)粘S玫腸ron恩溅,具體的就不貼出來了
  • zone
    使用方式:@Scheduled(zone = "GMT+08:00")
    源碼定義:String zone() default "";
    說明:時區(qū)隔箍,cron表達(dá)式會基于這個時區(qū)解析,默認(rèn)為空脚乡,會取應(yīng)用所在服務(wù)器的時區(qū)蜒滩,一般不填就可以了,和jdk中TimeZone用的是統(tǒng)一體系奶稠,就不具體說了
  • fixedDelay
    使用方式:@Scheduled(fixedDelay = 1)
    源碼定義:long fixedDelay() default -1;
    說明:上次執(zhí)行完了俯艰,相隔多長時間以后再執(zhí)行,單位是毫秒
  • fixedDelayString
    使用方式:
    @Scheduled(fixedDelayString = "1")
    @Scheduled(fixedDelayString = "${配置文件里面的值}")
    源碼定義:String fixedDelayString() default "";
    說明:和fixedDelay一樣锌订,是string類型的可以填數(shù)竹握,單位是毫秒,可以使用配置文件里面的值辆飘,使用方法和spring注入配置文件的使用方式一樣
  • fixedRate
    使用方式:@Scheduled(fixedRate = 1)
    源碼定義:long fixedRate() default -1;
    說明:上次執(zhí)行開始后啦辐,相隔多長時間以后再執(zhí)行污秆,單位是毫秒
  • fixedRateString
    使用方式:
    @Scheduled(fixedRateString = "1")
    @Scheduled(fixedRateString = "${配置文件里面的值}")
    源碼定義:String fixedRateString() default "";
    說明:和fixedRate一樣,昧甘,是string類型的可以填數(shù)良拼,單位是毫秒,可以使用配置文件里面的值充边,使用方法和spring注入配置文件的使用方式一樣
  • initialDelay
    使用方式:@Scheduled(initialDelay = 1)
    源碼定義:long initialDelay() default -1;
    說明:上第一次執(zhí)行后庸推,相隔多長時間以后再執(zhí)行,單位是毫秒
  • initialDelayString
    使用方式:
    @Scheduled(initialDelayString = "1")
    @Scheduled(initialDelayString = "${配置文件里面的值}")
    源碼定義:String initialDelayString() default "";
    說明:和initialDelay一樣浇冰,贬媒,是string類型的可以填數(shù),單位是毫秒肘习,可以使用配置文件里面的值际乘,使用方法和spring注入配置文件的使用方式一樣

springboot通過注接口創(chuàng)建定時任務(wù)

通過接口創(chuàng)建定時,就會比較靈活漂佩,定時cron表達(dá)式就不用寫死在代碼的注解上了脖含,可以通過存儲到數(shù)據(jù)庫等存儲系統(tǒng)中,在接口中來獲取這個配置的表達(dá)式投蝉,這樣可以實現(xiàn)一個簡易的任務(wù)調(diào)度平臺养葵,通過數(shù)據(jù)庫配置就可以管理定時任務(wù)的執(zhí)行

實現(xiàn)接口SchedulingConfigurer

主要用的是這個接口SchedulingConfigurer,他是org.springframework.scheduling.annotation.SchedulingConfigurer這個包路徑瘩缆,其實也是都在org.springframework:spring-context這個包下


org.springframework:spring-context包

就引入org.springframework:spring-context這個包就可以使用了

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
</dependency>
主要方法

復(fù)寫configureTasks方法关拒,這個方法通過ScheduledTaskRegistrar來添加定時任務(wù),大致看方法庸娱,入?yún)⒒臼且粋€線程對象着绊,后面那個參數(shù)和注解里面一樣,主要有cron表達(dá)式熟尉,delay上次執(zhí)行完了归露,相隔多長時間以后再執(zhí)行,initial什么的就不一一贅述了


主要方法
直接上代碼來一個栗子
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.config.Task;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @createdTime: 2020/4/7 18:33.
 * @version: 1.0 .
 */
@Component
@EnableScheduling
public class TestTask2 implements SchedulingConfigurer {

    private static ThreadLocal<SimpleDateFormat> dateFormat =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    /**
     * Callback allowing a {@link TaskScheduler
     * TaskScheduler} and specific {@link Task Task}
     * instances to be registered against the given the {@link ScheduledTaskRegistrar}.
     *
     * @param taskRegistrar the registrar to be configured.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        System.err.println("假裝從數(shù)據(jù)庫中獲取到了配置好的定時任務(wù)執(zhí)行計劃");
        String cron = "0/10 * * * * ?";
        taskRegistrar.addCronTask(() -> {
            System.err.println("接口定時任務(wù)執(zhí)行定時任務(wù)了臣樱,執(zhí)行時間為:" + dateFormat.get().format(new Date()));
        },cron);
    }
}

這里通過重寫configureTasks方法靶擦,使用ScheduledTaskRegistrar對象來創(chuàng)建定時任務(wù),然后表達(dá)式可以從數(shù)據(jù)庫等地方讀取雇毫,演示時候就不寫那塊代碼了,這樣可以很簡單的實現(xiàn)出來一個簡單的任務(wù)調(diào)度平臺
看下執(zhí)行結(jié)果:


執(zhí)行結(jié)果

springboot創(chuàng)建定時任務(wù)就為大家說到這里踩蔚,歡迎大家來交流棚放,指出文中一些說錯的地方,讓我加深認(rèn)識馅闽。
謝謝大家飘蚯!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馍迄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子局骤,更是在濱河造成了極大的恐慌攀圈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦甩,死亡現(xiàn)場離奇詭異赘来,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凯傲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門犬辰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冰单,你說我怎么就攤上這事幌缝。” “怎么了诫欠?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵涵卵,是天一觀的道長。 經(jīng)常有香客問我荒叼,道長缘厢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任甩挫,我火速辦了婚禮贴硫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伊者。我一直安慰自己英遭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布亦渗。 她就那樣靜靜地躺著挖诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法精。 梳的紋絲不亂的頭發(fā)上多律,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音搂蜓,去河邊找鬼狼荞。 笑死,一個胖子當(dāng)著我的面吹牛帮碰,可吹牛的內(nèi)容都是我干的相味。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼殉挽,長吁一口氣:“原來是場噩夢啊……” “哼丰涉!你這毒婦竟也來了拓巧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤一死,失蹤者是張志新(化名)和其女友劉穎肛度,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體投慈,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡承耿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛裤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘩绒。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖带族,靈堂內(nèi)的尸體忽然破棺而出锁荔,到底是詐尸還是另有隱情,我是刑警寧澤蝙砌,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布阳堕,位于F島的核電站弧可,受9級特大地震影響绞蹦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宏所,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一肚邢、第九天 我趴在偏房一處隱蔽的房頂上張望壹堰。 院中可真熱鬧,春花似錦骡湖、人聲如沸贱纠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆焊。三九已至,卻和暖如春浦夷,著一層夾襖步出監(jiān)牢的瞬間辖试,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工劈狐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留罐孝,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓懈息,卻偏偏與公主長得像肾档,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辫继,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容