欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot實(shí)現(xiàn)定時(shí)任務(wù)的4種方式舉例詳解

 更新時(shí)間:2024年01月15日 10:11:04   作者:紅色的羽毛.  
在我們開(kāi)發(fā)項(xiàng)目過(guò)程中經(jīng)常需要定時(shí)任務(wù)來(lái)幫助我們來(lái)做一些內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于Springboot實(shí)現(xiàn)定時(shí)任務(wù)的4種方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一. 使用@Scheduled注解

@Component
public class MyScheduledTask {
    
    //每天凌晨0點(diǎn)0分0秒時(shí)觸發(fā)執(zhí)行
    @Scheduled(cron = "0 0 0 * * ?") 
    public void Timing() {
        // 執(zhí)行定時(shí)任務(wù)業(yè)務(wù)邏輯
    }
}

解釋:

  • @Component注解是Spring框架中被用于聲明一個(gè)Bean的注解, 被該注解修飾的類(lèi)將被Spring自動(dòng)掃描到, 并注冊(cè)為一個(gè)Bean, 該注解通常與其他注解(如@Service,@Repository,@Controller)一起使用,用于將類(lèi)標(biāo)記為特定類(lèi)型的組件。
  • @Scheduled注解用于指定方法或者類(lèi)的某個(gè)方法為定時(shí)任務(wù), 它可以使用cron表達(dá)式或者固定的時(shí)延來(lái)定義任務(wù)的執(zhí)行時(shí)間。
  • cron表達(dá)式是一種用于定義定時(shí)任務(wù)執(zhí)行時(shí)間的字符串格式, 它包含六個(gè)或七個(gè)部分, 分別表示秒, 分, 小時(shí), 日期, 月份, 星期和年份(可選)用空格將這些部分 分隔開(kāi),具體每個(gè)部分的取值范圍和特殊符號(hào)含義請(qǐng)參考cron表達(dá)式的相關(guān)文檔。
  • "0 0 0 * * ?"是一個(gè)cron表達(dá)式的例子,它表示每天的凌晨0點(diǎn)0分0秒觸發(fā)任務(wù)執(zhí)行。
  • 所以當(dāng)將@Component和@Scheduled注解一起使用時(shí), 被@Component注解修飾的類(lèi)將會(huì)被Spring識(shí)別為一個(gè)組件, 并包含一個(gè)定時(shí)任務(wù)方法, 該方法將在每天凌晨0點(diǎn)0分0秒時(shí)觸發(fā)執(zhí)行。

二. 使用SchedulingConfigurer接口

@Configuration
@EnableScheduling
public class MyScheduledTask implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(() -> {
            // 執(zhí)行任務(wù)邏輯
        }, "0 0 0 * * ?");
    }
}

解釋:

  • 通過(guò)實(shí)現(xiàn)SchedulingConfigurer接口,重寫(xiě)configureTasks方法,可以配置多個(gè)定時(shí)任務(wù),并指定其執(zhí)行時(shí)間。

  • 在Spring Boot中,我們需要?jiǎng)?chuàng)建一個(gè)類(lèi),并使用@Configuration注解進(jìn)行標(biāo)注。然后,我們需要實(shí)現(xiàn)SchedulingConfigurer接口, 并實(shí)現(xiàn)其中的configureTasks方法, 在configureTasks方法中, 我們可以使用ScheduledTaskRegistrar對(duì)象來(lái)添加一個(gè)或多個(gè)定時(shí)任務(wù),并指定其執(zhí)行時(shí)間。

  • 讓我們逐一解釋各個(gè)部分的作用:
    (1) @Configuration注解:這是一個(gè)Spring框架的注解,用于標(biāo)注配置類(lèi)。通過(guò)將一個(gè)類(lèi)標(biāo)記為@Configuration,Spring會(huì)將其識(shí)別為一個(gè)配置類(lèi),并在運(yùn)行時(shí)加載這個(gè)類(lèi)中定義的Bean定義和組件。

    (2) @EnableScheduling注解:這是一個(gè)Spring框架的注解,用于在Spring應(yīng)用程序中啟用定時(shí)任務(wù)功能。通過(guò)在配置類(lèi)上添加@EnableScheduling注解,Spring會(huì)自動(dòng)檢測(cè)標(biāo)記有@Scheduled注解的方法,并在指定時(shí)間觸發(fā)這些方法的執(zhí)行。

    (3) SchedulingConfigurer接口:這是Spring框架提供的一個(gè)接口,用于配置定時(shí)任務(wù)。通過(guò)實(shí)現(xiàn)該接口,并重寫(xiě)其中的configureTasks方法,我們可以在應(yīng)用程序的啟動(dòng)過(guò)程中,自定義配置定時(shí)任務(wù)的執(zhí)行時(shí)間和邏輯。

    (4) configureTasks方法:這是SchedulingConfigurer接口中的一個(gè)方法,用于配置定時(shí)任務(wù)。通過(guò)使用參數(shù)類(lèi)型為ScheduledTaskRegistrar的ScheduledTaskRegistrar對(duì)象,我們可以在該方法中添加定時(shí)任務(wù)并設(shè)置其執(zhí)行時(shí)間。

  • 在configureTasks方法中, ScheduledTaskRegistrar對(duì)象提供了一系列的方法用于配置定時(shí)任務(wù):
    (1) addCronTask:添加一個(gè)基于cron表達(dá)式的定時(shí)任務(wù)。
    (1) addFixedDelayTask:添加一個(gè)固定延遲時(shí)間的定時(shí)任務(wù)。
    (1) addFixedRateTask:添加一個(gè)固定速率的定時(shí)任務(wù)。
    (1) addTriggerTask:添加一個(gè)基于Trigger的定時(shí)任務(wù)。

三. 使用@EnableScheduling注解和@Scheduled注解結(jié)合

@Configuration
@EnableScheduling
public class MyScheduledTask {

    @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨執(zhí)行
    public void executeTask() {
        // 執(zhí)行任務(wù)邏輯
    }
}

解釋:

  • 使用@EnableScheduling注解和@Scheduled注解結(jié)合, 在配置類(lèi)上添加@EnableScheduling注解,表示啟用定時(shí)任務(wù)功能,在需要執(zhí)行定時(shí)任務(wù)的方法上添加@Scheduled注解,定義任務(wù)的執(zhí)行時(shí)間。
  • 關(guān)于@Configuration @EnableScheduling @Scheduled(cron = “0 0 0 * * ?”)上面有介紹。

四. 使用@Async注解和ThreadPoolTaskScheduler實(shí)現(xiàn)定時(shí)任務(wù)的異步執(zhí)行

@Configuration
@EnableAsync
public class MyScheduledTask {
    @Async
    @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨執(zhí)行
    public void executeTask() {
        // 執(zhí)行任務(wù)邏輯
    }
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }
}

解釋:

  • 使用@Async注解和ThreadPoolTaskScheduler, 通過(guò)在定時(shí)任務(wù)方法上添加@Async注解,同時(shí)配合使用ThreadPoolTaskScheduler來(lái)配置線程池,實(shí)現(xiàn)定時(shí)任務(wù)的異步執(zhí)行。
  • 在這種方式中,我們首先需要在配置類(lèi)上添加@EnableAsync注解,用于啟用異步任務(wù)的功能。
  • 然后,我們需要在定時(shí)任務(wù)方法上添加@Async注解,表示該方法是一個(gè)異步任務(wù)。
  • @Async注解告訴Spring,在調(diào)用該方法時(shí)應(yīng)該創(chuàng)建一個(gè)新的線程來(lái)執(zhí)行該方法,并立即返回。
  • 為了配置線程池以供異步任務(wù)使用,我們需要在配置類(lèi)中創(chuàng)建一個(gè)名為taskScheduler的ThreadPoolTaskScheduler的Bean,并進(jìn)行相應(yīng)的配置。ThreadPoolTaskScheduler是Spring提供的一個(gè)線程池調(diào)度器,用于執(zhí)行異步任務(wù)。

拓展:@Scheduled的參數(shù)

(1):cron:

[秒] [分] [小時(shí)] [日] [月] [周] [年]
@Scheduled(cron = "*/5 * * * * ?")
public void test(){}

每隔5秒執(zhí)行一次:*/5 * * * * ?

每隔1分鐘執(zhí)行一次:0 */1 * * * ?

每天23點(diǎn)執(zhí)行一次:0 0 23 * * ?

每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?

每月1號(hào)凌晨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 * * ?

  • *:表示所有值。 例如:在分的字段上設(shè)置 *,表示每一分鐘都會(huì)觸發(fā)。
  • ?:表示不指定值。使用的場(chǎng)景為不需要關(guān)心當(dāng)前設(shè)置這個(gè)字段的值。例如:要在每月的10號(hào)觸發(fā)一個(gè)操作,但不關(guān)心是周幾,所以需要周位置的那個(gè)字段設(shè)置為”?” 具體設(shè)置為 0 0 0 10 * ?
  • -:表示區(qū)間。例如 在小時(shí)上設(shè)置 “10-12”,表示 10,11,12點(diǎn)都會(huì)觸發(fā)。
  • ,: 表示指定多個(gè)值,例如在周字段上設(shè)置 “MON,WED,FRI” 表示周一,周三和周五觸發(fā)
  • /:用于遞增觸發(fā)。如在秒上面設(shè)置”5/15” 表示從5秒開(kāi)始,每增15秒觸發(fā)(5,20,35,50)。 在月字段上設(shè)置’1/3’所示每月1號(hào)開(kāi)始,每隔三天觸發(fā)一次。

通配符說(shuō)明可以去查詢(xún)相關(guān)資料

cron還支持占位符:

@Scheduled(cron = "${time.cron}")
public void test(){}

(2) fixedDelay:上一次執(zhí)行完畢時(shí)間點(diǎn)之后多長(zhǎng)時(shí)間再執(zhí)行。

@Scheduled(fixedDelay = 5000) //上一次執(zhí)行完畢時(shí)間點(diǎn)之后5秒再執(zhí)行
public void test(){}

(3) fixedDelayString:與 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(fixedDelayString = "5000") //上一次執(zhí)行完畢時(shí)間點(diǎn)之后5秒再執(zhí)行
public void test(){}
@Scheduled(fixedDelayString = "${time.fixedDelayString}") //上一次執(zhí)行完畢時(shí)間點(diǎn)之后5秒再執(zhí)行
public void test(){}

(4) fixedRate:上一次開(kāi)始執(zhí)行時(shí)間點(diǎn)之后多長(zhǎng)時(shí)間再執(zhí)行。

@Scheduled(fixedRate = 5000) //上一次開(kāi)始執(zhí)行時(shí)間點(diǎn)之后5秒再執(zhí)行
public void test(){}

(5) fixedRateString:與 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(fixedRateString = "${time.fixedRateString}") //上一次開(kāi)始執(zhí)行時(shí)間點(diǎn)之后5秒再執(zhí)行
public void test(){}

(6) initialDelay:第一次延遲多長(zhǎng)時(shí)間后再執(zhí)行。

@Scheduled(initialDelay = 1000, fixedRate = 5000) //第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每5秒執(zhí)行一次
public void test(){}

(6) initialDelayString:與 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(initialDelayString = "${time.initialDelayString}", fixedRate = 5000) //第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每5秒執(zhí)行一次
public void test(){}

總結(jié) 

到此這篇關(guān)于Springboot實(shí)現(xiàn)定時(shí)任務(wù)的4種方式的文章就介紹到這了,更多相關(guān)Springboot實(shí)現(xiàn)定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Cookie在Java中的使用

    Cookie在Java中的使用

    Cookie又稱(chēng)“小甜餅”,類(lèi)型為“小型文本文件”,指某些網(wǎng)站為了辨別用戶(hù)身份而儲(chǔ)存在用戶(hù)本地終端(Client Side)上的數(shù)據(jù)(通常經(jīng)過(guò)加密)。由用戶(hù)客戶(hù)端計(jì)算機(jī)暫時(shí)或永久保存的信息。本文將講解Cookie在Java中的使用,感興趣的朋友可以了解下
    2021-05-05
  • JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證

    JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證

    本篇文章主要介紹了JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • java中的匿名內(nèi)部類(lèi)詳細(xì)總結(jié)

    java中的匿名內(nèi)部類(lèi)詳細(xì)總結(jié)

    以下是對(duì)java中的匿名內(nèi)部類(lèi)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • Spring中的refreshContext源碼分析

    Spring中的refreshContext源碼分析

    這篇文章主要介紹了Spring中的refreshContext源碼分析,在SpringBoot啟動(dòng)流程中,主要的兩個(gè)階段是初始化SpringApplication對(duì)象以及SpringApplication.run方法執(zhí)行的內(nèi)容,今天主要細(xì)講的是SpringApplication.run中的刷新容器refreshContext方法,需要的朋友可以參考下
    2023-12-12
  • Android Home鍵監(jiān)聽(tīng)的實(shí)現(xiàn)代碼

    Android Home鍵監(jiān)聽(tīng)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android Home 鍵監(jiān)聽(tīng)的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • SpringBoot中服務(wù)消費(fèi)的實(shí)現(xiàn)

    SpringBoot中服務(wù)消費(fèi)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中服務(wù)消費(fèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Idea?編譯并運(yùn)行?Spark?3.1.1?源碼的方法

    Idea?編譯并運(yùn)行?Spark?3.1.1?源碼的方法

    這篇文章主要介紹了Idea?編譯并運(yùn)行?Spark?3.1.1源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Java中的線程安全集合CopyOnWriteArrayList解析

    Java中的線程安全集合CopyOnWriteArrayList解析

    這篇文章主要介紹了Java中的線程安全CopyOnWriteArrayList解析,CopyOnWriteArrayList是ArrayList的線程安全版本,從他的名字可以推測(cè),CopyOnWriteArrayList是在有寫(xiě)操作的時(shí)候會(huì)copy一份數(shù)據(jù),然后寫(xiě)完再設(shè)置成新的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • java中struts 框架的實(shí)現(xiàn)

    java中struts 框架的實(shí)現(xiàn)

    本文給大家介紹的是java中struts 框架的實(shí)現(xiàn),有需要的小伙伴可以參考下。
    2015-06-06
  • 解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問(wèn)題

    解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問(wèn)題

    Minio是Apache?License?v2.0下發(fā)布的對(duì)象存儲(chǔ)服務(wù)器,使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu)。這篇文章主要介紹了SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù),需要的朋友可以參考下
    2022-03-03

最新評(píng)論