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

Spring關(guān)于@Scheduled限制的問(wèn)題

 更新時(shí)間:2021年10月18日 10:28:34   作者:辛晨V  
這篇文章主要介紹了Spring關(guān)于@Scheduled限制的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring @Scheduled限制

@Scheduled具有一定的限制性,它畢竟不是quartz,只是簡(jiǎn)單的定時(shí),比jdk Timer就加入了線(xiàn)程池而以

  • @Scheduled 不支持年份定時(shí)
  • @Scheduled 不支持W L這些字母

沒(méi)辦法 如果非要使用那就只能放棄注解使用XML方式了

Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞

一. 問(wèn)題描述

最近項(xiàng)目中發(fā)現(xiàn)一個(gè)問(wèn)題,計(jì)劃每日凌晨4:40執(zhí)行一個(gè)定時(shí)任務(wù),使用注解方式: @Scheduled(cron = “0 40 4 * * ?”),cron表達(dá)式明顯沒(méi)有問(wèn)題,但是這個(gè)定時(shí)任務(wù)總是不按時(shí)執(zhí)行,有時(shí)候得等到8點(diǎn)多,有時(shí)候9點(diǎn)多才執(zhí)行。后來(lái)查了下,原來(lái)這種定時(shí)方式默認(rèn)是單線(xiàn)程執(zhí)行的,恰好我這里有多個(gè)定時(shí)任務(wù),并且其中有個(gè)在4:40之前的定時(shí)任務(wù)比較耗時(shí),導(dǎo)致4:40的任務(wù)只能等待之前的任務(wù)執(zhí)行完成才能夠觸發(fā),所以要自己手動(dòng)把定時(shí)任務(wù)設(shè)置成多線(xiàn)程的方式才行。

二. 場(chǎng)景復(fù)現(xiàn)

項(xiàng)目描述:使用Springboot進(jìn)行開(kāi)發(fā)

設(shè)置兩個(gè)定時(shí)任務(wù),每5s執(zhí)行一次,并打印出其執(zhí)行情況

代碼如下:

@Component
@Log4j2
public class ScheduledTask {
    @Scheduled(cron = "0/5 * * * * ?")
    public void task1() throws InterruptedException {
        log.info("I am task11111111, current thread: {}", Thread.currentThread());
        while (true) {
            //模擬耗時(shí)任務(wù),阻塞10s
            Thread.sleep(10000);
            break;
        }
    }
    @Scheduled(cron = "0/5 * * * * ?")
    public void task2() {
        log.info("I am task22222222, current thread: {}", Thread.currentThread());
    }
}

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

2019-04-24 17:11:15.008 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]
2019-04-24 17:11:15.009 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[scheduling-1,5,main]
2019-04-24 17:11:25.009 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]
2019-04-24 17:11:30.002 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]
2019-04-24 17:11:30.003 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[scheduling-1,5,main]
2019-04-24 17:11:40.004 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]

由結(jié)果可見(jiàn),task1與task2由同一個(gè)線(xiàn)程Thread[scheduling-1,5,main]執(zhí)行,也即該定時(shí)任務(wù)默認(rèn)使用單線(xiàn)程,并且由于task1阻塞了10s,導(dǎo)致本應(yīng)5s執(zhí)行一次的定時(shí)任務(wù)10s才執(zhí)行一次。

三. 解決方案

網(wǎng)上有多種解決方案,以下列舉兩種

方案一:使用@Async注解實(shí)現(xiàn)異步任務(wù)

這種方式比較簡(jiǎn)單,在定時(shí)任務(wù)上加上@Async注解,注意:需啟動(dòng)類(lèi)配合加上 @EnableAsync才會(huì)生效

代碼如下:

@Component
@Log4j2
public class ScheduledTask {
    @Async
    @Scheduled(cron = "0/5 * * * * ?")
    public void task1() throws InterruptedException {
        log.info("I am task11111111, current thread: {}", Thread.currentThread());
        while (true) {
            //模擬耗時(shí)任務(wù),阻塞10s
            Thread.sleep(10000);
            break;
        }
    }
    @Async
    @Scheduled(cron = "0/5 * * * * ?")
    public void task2() {
        log.info("I am task22222222, current thread: {}", Thread.currentThread());
    }
}

運(yùn)行結(jié)果:

2019-04-24 17:03:00.024 INFO 2152 --- [ task-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[task-1,5,main]
2019-04-24 17:03:00.024 INFO 2152 --- [ task-2] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[task-2,5,main]
2019-04-24 17:03:05.001 INFO 2152 --- [ task-3] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[task-3,5,main]
2019-04-24 17:03:05.001 INFO 2152 --- [ task-4] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[task-4,5,main]
2019-04-24 17:03:10.002 INFO 2152 --- [ task-5] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[task-5,5,main]
2019-04-24 17:03:10.003 INFO 2152 --- [ task-6] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[task-6,5,main]

由運(yùn)行日志可見(jiàn),定時(shí)每5s執(zhí)行一次已生效,且每次任務(wù)使用的線(xiàn)程不一樣,也即實(shí)現(xiàn)了多線(xiàn)程執(zhí)行定時(shí)任務(wù),不會(huì)出現(xiàn)任務(wù)等待現(xiàn)象。此方式據(jù)說(shuō)默認(rèn)線(xiàn)程池大小為100,要是任務(wù)不多的話(huà)有點(diǎn)大材小用了,所以我覺(jué)得第二種方式比較好。

方案二:手動(dòng)設(shè)置定時(shí)任務(wù)的線(xiàn)程池大小

定時(shí)任務(wù)代碼部分還原,不使用@Async注解,新增啟動(dòng)代碼配置:

@Configuration
public class AppConfig implements SchedulingConfigurer {
    @Bean
    public Executor taskExecutor() {
     //指定定時(shí)任務(wù)線(xiàn)程數(shù)量,可根據(jù)需求自行調(diào)節(jié)
        return Executors.newScheduledThreadPool(3);
    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }
}

運(yùn)行結(jié)果如下:

2019-04-24 17:26:15.008 INFO 2164 --- [pool-1-thread-2] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[pool-1-thread-2,5,main]
2019-04-24 17:26:15.008 INFO 2164 --- [pool-1-thread-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[pool-1-thread-1,5,main]
2019-04-24 17:26:20.002 INFO 2164 --- [pool-1-thread-2] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[pool-1-thread-2,5,main]
2019-04-24 17:26:25.001 INFO 2164 --- [pool-1-thread-2] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[pool-1-thread-2,5,main]
2019-04-24 17:26:30.001 INFO 2164 --- [pool-1-thread-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[pool-1-thread-1,5,main]
2019-04-24 17:26:30.001 INFO 2164 --- [pool-1-thread-3] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[pool-1-thread-3,5,main]
2019-04-24 17:26:35.001 INFO 2164 --- [pool-1-thread-3] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[pool-1-thread-3,5,main]

由結(jié)果可見(jiàn),第二種方式也實(shí)現(xiàn)了多線(xiàn)程任務(wù)調(diào)度。

四. 總結(jié)

兩種方式各有優(yōu)缺點(diǎn):

比較 方案一 方案二
優(yōu)點(diǎn) 注解方式使用簡(jiǎn)單,代碼量少 配置靈活,線(xiàn)程數(shù)可控
缺點(diǎn) 線(xiàn)程數(shù)不可控,可能存在資源浪費(fèi) 需要增加編碼

留個(gè)坑,從日志上看@Async方式針對(duì)同一任務(wù)也是異步的,也即task1每5s會(huì)執(zhí)行一次,但是方式二貌似對(duì)同一個(gè)任務(wù)不會(huì)生效,task1執(zhí)行的時(shí)候需等待上一次執(zhí)行結(jié)束才會(huì)觸發(fā),并沒(méi)有每5s執(zhí)行一次。關(guān)于這個(gè)現(xiàn)象,下次再琢磨…

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Character類(lèi)的詳解

    Java Character類(lèi)的詳解

    本篇文章主要詳細(xì)介紹了JAVA中 Character類(lèi) 方法等,需要的朋友可以參考下
    2017-04-04
  • Java 線(xiàn)程池框架

    Java 線(xiàn)程池框架

    本文主要介紹了Java 線(xiàn)程池框架的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 淺談springMVC接收前端json數(shù)據(jù)的總結(jié)

    淺談springMVC接收前端json數(shù)據(jù)的總結(jié)

    下面小編就為大家分享一篇淺談springMVC接收前端json數(shù)據(jù)的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 解決Mybatis的serverTimezone時(shí)區(qū)出現(xiàn)問(wèn)題

    解決Mybatis的serverTimezone時(shí)區(qū)出現(xiàn)問(wèn)題

    這篇文章主要介紹了解決Mybatis的serverTimezone時(shí)區(qū)出現(xiàn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解spring cloud hystrix緩存功能的使用

    詳解spring cloud hystrix緩存功能的使用

    這篇文章主要介紹了詳解spring cloudhystrix緩存功能的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 一篇文章帶你玩轉(zhuǎn)JAVA單鏈表

    一篇文章帶你玩轉(zhuǎn)JAVA單鏈表

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)帶頭結(jié)點(diǎn)的單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn)

    springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn)

    這篇文章主要介紹了springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring P標(biāo)簽的使用詳解

    Spring P標(biāo)簽的使用詳解

    這篇文章主要介紹了Spring P標(biāo)簽的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 基于HttpClient上傳文件中文名亂碼的解決

    基于HttpClient上傳文件中文名亂碼的解決

    這篇文章主要介紹了HttpClient上傳文件中文名亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-07-07
  • Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    本篇文章主要介紹了Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-05-05

最新評(píng)論

桃江县| 酉阳| 曲松县| 会东县| 鄂托克旗| 丽江市| 蕉岭县| 城固县| 康平县| 辽阳市| 始兴县| 团风县| 黄石市| 余姚市| 新巴尔虎左旗| 富阳市| 奉贤区| 浦江县| 延安市| 固始县| 马公市| 白河县| 台江县| 张北县| 庄浪县| 屏边| 嵊州市| 武隆县| 绥德县| 二连浩特市| 宜君县| 荣成市| 赤城县| 周口市| 白银市| 连平县| 东乌珠穆沁旗| 平泉县| 余姚市| 镶黄旗| 梁山县|