最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解

 更新時(shí)間:2024年01月26日 09:50:18   作者:ThinkPet  
這篇文章主要介紹了SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解,SpringBoot框架中提供了2個(gè)注解來(lái)讓開發(fā)者快速配置來(lái)實(shí)現(xiàn)單機(jī)定時(shí)任務(wù)調(diào)度的功能,分別是@EnableScheduling和 @Scheduled,需要的朋友可以參考下

SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能

SpringBoot框架中提供了2個(gè)注解來(lái)讓開發(fā)者快速配置來(lái)實(shí)現(xiàn)單機(jī)定時(shí)任務(wù)調(diào)度的功能。

分別是@EnableScheduling和 @Scheduled

配置EnableScheduling注解

@EnableScheduling注解意思是啟用SpringBoot框架的單機(jī)定時(shí)任務(wù)調(diào)度的功能,這個(gè)注解要配置到app的啟動(dòng)類上,或者你自定義的@Configuration配置類上,一般都配置到項(xiàng)目的啟動(dòng)類上,方便查找

如下代碼所示

package cn.thinkpet.springbootappscaffold;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling //在啟動(dòng)類上加這個(gè)注解,表示開啟springboot定時(shí)任務(wù)功能
@SpringBootApplication
public class SpringbootAppScaffoldApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootAppScaffoldApplication.class, args);
    }
}

定義1個(gè)組件bean,用來(lái)存放要執(zhí)行調(diào)度的task任務(wù)

package cn.thinkpet.springbootappscaffold;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Test1Schedule {
    //@Scheduled注解是springboot提供的單機(jī)應(yīng)用的定時(shí)任務(wù)調(diào)度解決方案
    //cron是配置定時(shí)任務(wù)調(diào)度的 spring-cron表達(dá)式
    // spring-cron 一共可以有6個(gè)參數(shù) 以空格分開
        // 注意spring-cron 和quartz的cron不同 ,即 spring-cron不支持配置年份,沒(méi)有第7個(gè)參數(shù),
        // 如果需要指定年份的定時(shí)任務(wù)建議使用quartz,xxl-job,elastic-job這種分布式任務(wù)調(diào)度框架
    // 秒 分 時(shí) 日 月 周
    //┌───────────── second (0-59)
    // │ ┌───────────── minute (0 - 59)
    // │ │ ┌───────────── hour (0 - 23)
    // │ │ │ ┌───────────── day of the month (1 - 31)
    // │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
    // │ │ │ │ │ ┌───────────── day of the week (0 - 7)
    // │ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
    // │ │ │ │ │ │
    // * * * * * *
//    @Scheduled(cron = "0 41 21 * * ?")   // 定點(diǎn)--21點(diǎn)41分0秒 執(zhí)行
//    @Scheduled(cron = "*/1 * * * * ?") //定頻--每1秒執(zhí)行1次
    // 0 0 0 ? * MON#1  每月第一個(gè)星期一的零點(diǎn)0分0秒
    // 0 0 0 ? * 5#2  每月第2個(gè)星期五的零點(diǎn)0分0秒
    // 0 0 0 L * *    每月最后一天的零點(diǎn)0分0秒
    // 0 0 0 * * 5L   每月最后一個(gè)星期五的零點(diǎn)0分0秒
    //spring-cron表達(dá)式 值的常用通配符:
    //  *:表示所有值 比如用在日 表示每一天。
    //  ?:表示不指定值 比如周配置  表示不指定星期幾執(zhí)行。
    //   /:表示遞增觸發(fā) 比如  用在分 5/20 從第五分鐘開始 每增加20分鐘執(zhí)行一次。
    //   -:表示區(qū)間 比如用在 1-6  表示一月到六月執(zhí)行
    //   # :表示每月中的第幾個(gè)星期幾。5#2:表示每月第2個(gè)星期五。MON#1:表示每月第1個(gè)星期一
    //  L :表示最后,比如每月最后一個(gè)星期天
    //其他通配符可以查詢官方文檔
    //https://docs.spring.io/spring-framework/reference/integration/scheduling.html#scheduling-cron-expression
    @Scheduled(cron = "0/1 * * * * ?")
    public void singleTaskTest1() throws InterruptedException {
        log.info("singleTaskTest1");
    }
    @Scheduled(cron = "0/1 * * * * ?")
    public void singleTaskTest2() throws InterruptedException {
        log.info("singleTaskTest2");
    }
//    @Scheduled(cron = "0/1 * * * * ?")
    @Scheduled(cron = "${test3.cron:0/2 * * * * ?}")
    //從yml或properties配置文件中讀取 cron 值,讀不到時(shí)使用默認(rèn)的 0/2 * * * * ?
    public void singleTaskTest3() throws InterruptedException {
        log.info("singleTaskTest3");
//        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
    }
    //----------如果嫌配置cron表達(dá)式麻煩,可以使用如下的固定速度+固定延期 的方式來(lái)配置定時(shí)任務(wù)-----------
    //    @Scheduled(initialDelay = 3000,fixedRate = 5000)
    //initialDelay表示第一次延遲多少毫秒執(zhí)行,單位是毫秒
    //fixedRate表示多久執(zhí)行一次,單位是毫秒
    @Scheduled(initialDelay = 3000,fixedRate = 5000) //第一次延遲3秒執(zhí)行,后面間隔5秒執(zhí)行一次
    public void singleTaskTest4() throws InterruptedException {
        log.info("singleTaskTest4");
    }
}

application.properties文件的配置

server.port=8080
#配置singleTaskTest3的cron表達(dá)式
test3.cron=0/7 * * * * ?

重寫SpringBoot任務(wù)調(diào)度使用的線程池執(zhí)行器

在實(shí)際開發(fā)中,常常會(huì)有多個(gè)task并發(fā)執(zhí)行的場(chǎng)景,此時(shí)為了實(shí)現(xiàn)task之間的異步,需要自定義調(diào)度器使用的 ThreadPoolTaskScheduler

package cn.thinkpet.springbootappscaffold;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
 * 為了實(shí)現(xiàn)springboot 多個(gè)定時(shí)任務(wù)調(diào)度 之間的并發(fā)執(zhí)行,
 * 需要重寫 調(diào)度器使用的 ThreadPoolTaskScheduler
 */
@Configuration
public class MyScheduledConfig implements SchedulingConfigurer {
    /**
     * 定義springboot定時(shí)任務(wù)的 --- 線程池大小
     */
    private static final int POOL_SIZE = 6;
    /**
     * 定義springboot定時(shí)任務(wù)的 ---自定義線程名前綴
     */
    private static final String TASK_THREAD_PREFIX = "my-sche-task-";
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //需要?jiǎng)?chuàng)建1個(gè)springboot提供的ThreadPoolTaskScheduler
        ThreadPoolTaskScheduler bootScheduleExecutor = new ThreadPoolTaskScheduler();
        //配置這個(gè)springboot項(xiàng)目全部定時(shí)任務(wù)使用 的線程數(shù)是 POOL_SIZE
        //在實(shí)際應(yīng)用中需要考慮實(shí)際任務(wù)數(shù)量,創(chuàng)建相應(yīng)大小的線程池
        bootScheduleExecutor.setPoolSize(POOL_SIZE);
        //配置線程名前綴
        bootScheduleExecutor.setThreadNamePrefix(TASK_THREAD_PREFIX);
        //初始化線程池執(zhí)行器
        bootScheduleExecutor.initialize();
        //設(shè)置 調(diào)度器使用 bootScheduleExecutor
        taskRegistrar.setTaskScheduler(bootScheduleExecutor);
    }
}

測(cè)試效果

2023-06-04 18:17:03.519  INFO 16872 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-06-04 18:17:03.519  INFO 16872 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService
2023-06-04 18:17:03.534  INFO 16872 --- [           main] c.t.s.SpringbootAppScaffoldApplication   : Started SpringbootAppScaffoldApplication in 1.506 seconds (JVM running for 2.224)
2023-06-04 18:17:04.007  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:04.007  INFO 16872 --- [ my-sche-task-2] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:05.014  INFO 16872 --- [ my-sche-task-3] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:05.014  INFO 16872 --- [ my-sche-task-4] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:06.006  INFO 16872 --- [ my-sche-task-3] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:06.006  INFO 16872 --- [ my-sche-task-6] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:06.541  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest4
2023-06-04 18:17:07.013  INFO 16872 --- [ my-sche-task-2] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:07.013  INFO 16872 --- [ my-sche-task-4] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest3
2023-06-04 18:17:07.013  INFO 16872 --- [ my-sche-task-5] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:08.002  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:08.002  INFO 16872 --- [ my-sche-task-2] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:09.009  INFO 16872 --- [ my-sche-task-6] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:09.009  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:10.004  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:10.004  INFO 16872 --- [ my-sche-task-5] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:11.011  INFO 16872 --- [ my-sche-task-6] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:11.011  INFO 16872 --- [ my-sche-task-5] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:11.545  INFO 16872 --- [ my-sche-task-2] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest4
2023-06-04 18:17:12.002  INFO 16872 --- [ my-sche-task-4] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:12.002  INFO 16872 --- [ my-sche-task-3] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:13.009  INFO 16872 --- [ my-sche-task-1] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:13.009  INFO 16872 --- [ my-sche-task-6] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest2
2023-06-04 18:17:14.016  INFO 16872 --- [ my-sche-task-2] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest1
2023-06-04 18:17:14.016  INFO 16872 --- [ my-sche-task-4] c.t.springbootappscaffold.Test1Schedule  : singleTaskTest3

到此這篇關(guān)于SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解的文章就介紹到這了,更多相關(guān)SpringBoot內(nèi)置的單機(jī)任務(wù)調(diào)度功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)教程之繼承詳解

    Java基礎(chǔ)教程之繼承詳解

    這篇文章主要介紹了Java基礎(chǔ)教程之繼承詳解,繼承是除組合(composition)之外,提高代碼重復(fù)可用性(reusibility)的另一種重要方式,本文對(duì)繼承做了詳細(xì)講解,需要的朋友可以參考下
    2014-08-08
  • Java 堆排序?qū)嵗?大頂堆、小頂堆)

    Java 堆排序?qū)嵗?大頂堆、小頂堆)

    下面小編就為大家分享一篇Java 堆排序?qū)嵗?大頂堆、小頂堆),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • springboot AutoConfigureAfter控制Bean的注入順序方法詳解

    springboot AutoConfigureAfter控制Bean的注入順序方法詳解

    這個(gè)文章主要介紹一下@AutoConfigureAfter在spring框架中的作用,在使用過(guò)程中,很多開發(fā)人員在使用它的時(shí)候都出現(xiàn)了問(wèn)題,問(wèn)題比較多的就是它們的注冊(cè)順序總不是我們預(yù)期的,下面介紹一下正常的使用方法,感興趣的朋友一起看看吧
    2024-05-05
  • Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識(shí)入門解析

    Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識(shí)入門解析

    這篇文章主要介紹了Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識(shí)入門解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot3整合Hutool-captcha實(shí)現(xiàn)圖形驗(yàn)證碼

    SpringBoot3整合Hutool-captcha實(shí)現(xiàn)圖形驗(yàn)證碼

    在整合技術(shù)框架的時(shí)候,想找一個(gè)圖形驗(yàn)證碼相關(guān)的框架,看到很多驗(yàn)證碼的maven庫(kù)不再更新了或中央倉(cāng)庫(kù)下載不下來(lái),還需要多引入依賴,后面看到了Hutool圖形驗(yàn)證碼(Hutool-captcha)中對(duì)驗(yàn)證碼的實(shí)現(xiàn),所以本文介紹了SpringBoot3整合Hutool-captcha實(shí)現(xiàn)圖形驗(yàn)證碼
    2024-11-11
  • maven搭建spring項(xiàng)目(圖文教程)

    maven搭建spring項(xiàng)目(圖文教程)

    下面小編就為大家?guī)?lái)一篇maven搭建spring項(xiàng)目(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • MyBatis Plus 實(shí)現(xiàn)多表分頁(yè)查詢功能的示例代碼

    MyBatis Plus 實(shí)現(xiàn)多表分頁(yè)查詢功能的示例代碼

    這篇文章主要介紹了MyBatis Plus 實(shí)現(xiàn)多表分頁(yè)查詢功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 結(jié)合Service層講解DAO層的異常處理操作

    結(jié)合Service層講解DAO層的異常處理操作

    這篇文章主要介紹了結(jié)合Service層講解DAO層的異常處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實(shí)現(xiàn)多選批量刪除功能(vue+Element)

    Java實(shí)現(xiàn)多選批量刪除功能(vue+Element)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多選批量刪除功能,包括前端vue實(shí)現(xiàn)代碼文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目(圖解)

    IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目(圖解)

    這篇文章主要介紹了IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目的步驟詳解,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

尚志市| 高碑店市| 远安县| 通道| 余庆县| 大方县| 沿河| 贵州省| 沾化县| 遂川县| 米易县| 双牌县| 普陀区| 阿克苏市| 南投市| 白沙| 兴义市| 青田县| 阜新市| 贞丰县| 杭锦后旗| 八宿县| 开平市| 垣曲县| 晋宁县| 昭苏县| 嘉禾县| 塘沽区| 夏邑县| 个旧市| 稷山县| 黎川县| 新绛县| 社旗县| 昌宁县| 莱阳市| 天水市| 泸溪县| 永靖县| 义乌市| 社旗县|