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

Spring內(nèi)置定時(shí)任務(wù)調(diào)度@Scheduled使用詳解

 更新時(shí)間:2020年12月04日 10:17:37   作者:codedot  
這篇文章主要介紹了Spring內(nèi)置定時(shí)任務(wù)調(diào)度@Scheduled使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Spring提供了@Scheduled注解用于定時(shí)任務(wù)。

一、@Scheduled的基本使用

啟用調(diào)度支持:@EnableScheduling

可以將@Scheduled注釋與觸發(fā)器元數(shù)據(jù)一起添加到方法中。例如,以下方法每隔5秒調(diào)用一次,并具有固定的延遲,這意味著周期是從前面每次調(diào)用的完成時(shí)間開始計(jì)算的

@Scheduled(fixedDelay=5000)
public void doSomething() {
// something that should execute periodically
}

如果需要固定速率執(zhí)行,可以更改批注中指定的屬性名。以下方法每5秒調(diào)用一次(在每次調(diào)用的連續(xù)開始時(shí)間之間計(jì)算)

@Scheduled(fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}

對(duì)于固定延遲和固定速率任務(wù),可以通過(guò)指示在首次執(zhí)行方法之前要等待的毫秒數(shù)來(lái)指定初始延遲

@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}

如果簡(jiǎn)單的周期性調(diào)度不夠表達(dá),可以提供cron表達(dá)式。例如,以下命令僅在工作日?qǐng)?zhí)行:

@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}

實(shí)現(xiàn)SchedulingConfigurer接口,重寫configureTasks方法:

@Schedule注解的一個(gè)缺點(diǎn)就是其定時(shí)時(shí)間不能動(dòng)態(tài)更改,它適用于具有固定任務(wù)周期的任務(wù),若要修改任務(wù)執(zhí)行周期,只能走“停服務(wù)→修改任務(wù)執(zhí)行周期→重啟服務(wù)”這條路。而基于 SchedulingConfigurer 接口方式可以做到。SchedulingConfigurer 接口可以實(shí)現(xiàn)在@Configuration等注解類上。

ScheduledTaskRegistrar類包括以下幾個(gè)重要方法:

void addTriggerTask(Runnable task, Trigger trigger)
void addTriggerTask(TriggerTask task)
void addCronTask(Runnable task, String expression)
void addCronTask(CronTask task)
void addFixedRateTask(Runnable task, long interval)
void addFixedRateTask(IntervalTask task)
void addFixedDelayTask(Runnable task, long delay)
void addFixedDelayTask(IntervalTask task)

具體實(shí)現(xiàn)參考如下:

@Component
public class TestTask implements SchedulingConfigurer {
 
  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.addTriggerTask(new Runnable() {
      @Override
      public void run() {
        // 定時(shí)任務(wù)要執(zhí)行的內(nèi)容
        System.out.println("【開始執(zhí)行定時(shí)任務(wù)。。。】");
      }
    }, new Trigger() {
      @Override
      public Date nextExecutionTime(TriggerContext triggerContext) {
        // 定時(shí)任務(wù)觸發(fā),可修改定時(shí)任務(wù)的執(zhí)行周期
        String cron = "0 0/5 * * * ?"; //可以將表達(dá)式配置在數(shù)據(jù)庫(kù)中
        CronTrigger trigger = new CronTrigger(cron);
        Date nextExecDate = trigger.nextExecutionTime(triggerContext);
        return nextExecDate;
      }
    });
  }
}

提示:如果在數(shù)據(jù)庫(kù)修改時(shí)格式出現(xiàn)錯(cuò)誤,則定時(shí)任務(wù)會(huì)停止,即使重新修改正確;此時(shí)只能重新啟動(dòng)項(xiàng)目才能恢復(fù)。

二、使用@Scheduled注意事項(xiàng)

  • spring的注解@Scheduled 需要寫在實(shí)現(xiàn)方法上;
  • 定時(shí)器的任務(wù)方法不能有返回值(如果有返回值,spring初始化的時(shí)候會(huì)告訴你有個(gè)錯(cuò)誤、需要設(shè)定一個(gè)proxytargetclass的某個(gè)值為true),不能指向任何的參數(shù);
  • 如果該方法需要與應(yīng)用程序上下文的其他對(duì)象進(jìn)行交互,通常是通過(guò)依賴注入來(lái)實(shí)現(xiàn);
  • 實(shí)現(xiàn)類上要有組件的注解@Component。

三、使用@Scheduled常見問(wèn)題

單線程任務(wù)丟失,轉(zhuǎn)為異步線程池

默認(rèn)的 ConcurrentTaskScheduler 計(jì)劃執(zhí)行器采用Executors.newSingleThreadScheduledExecutor() 實(shí)現(xiàn)單線程的執(zhí)行器。因此,對(duì)同一個(gè)調(diào)度任務(wù)的執(zhí)行總是同一個(gè)線程。如果任務(wù)的執(zhí)行時(shí)間超過(guò)該任務(wù)的下一次執(zhí)行時(shí)間,則會(huì)出現(xiàn)任務(wù)丟失,跳過(guò)該段時(shí)間的任務(wù)。上述問(wèn)題有以下解決辦法:

采用異步的方式執(zhí)行調(diào)度任務(wù),配置 Spring 的 @EnableAsync,在執(zhí)行定時(shí)任務(wù)的方法上標(biāo)注 @Async配置任務(wù)執(zhí)行池,線程池大小 n 的數(shù)量為 單個(gè)任務(wù)執(zhí)行所需時(shí)間 / 任務(wù)執(zhí)行的間隔時(shí)間。如下:

//每30秒執(zhí)行一次
@Async("taskExecutor")
@Scheduled(fixedRate = 1000 * 3)
public void reportCurrentTime(){
  System.out.println ("線程" + Thread.currentThread().getName() + "開始執(zhí)行定時(shí)任務(wù)===&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7&&&====》"
      + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  long start = System.currentTimeMillis();
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Spring嵌套事務(wù)是怎么回滾的

    淺談Spring嵌套事務(wù)是怎么回滾的

    本文主要介紹了Spring嵌套事務(wù)是怎么回滾的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • mybatis框架的xml映射文件常用查詢指南

    mybatis框架的xml映射文件常用查詢指南

    這篇文章主要給大家介紹了關(guān)于mybatis框架的xml映射文件常用查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺談Java的WeakHashMap源碼

    淺談Java的WeakHashMap源碼

    這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會(huì)被GC自動(dòng)刪除,即使程序員沒(méi)有調(diào)用remove()或者clear()方法,需要的朋友可以參考下
    2023-09-09
  • JAVA簡(jiǎn)單分組的算法實(shí)現(xiàn)

    JAVA簡(jiǎn)單分組的算法實(shí)現(xiàn)

    本文介紹了“JAVA簡(jiǎn)單分組的算法實(shí)現(xiàn)”,需要的朋友可以參考一下
    2013-03-03
  • MybatisPlus更新時(shí)部分失敗的問(wèn)題解決

    MybatisPlus更新時(shí)部分失敗的問(wèn)題解決

    這篇文章主要為大家詳細(xì)介紹了MybatisPlus更新時(shí)部分失敗的問(wèn)題分析和解決方法,文中的代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解

    Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解

    這篇文章主要介紹了Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot部署xxl-job方法詳細(xì)講解

    SpringBoot部署xxl-job方法詳細(xì)講解

    XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展,這篇文章主要介紹了springboot整合xxl-job流程,需要的朋友可以參考下
    2023-01-01
  • java設(shè)計(jì)模式之裝飾器模式(Decorator)

    java設(shè)計(jì)模式之裝飾器模式(Decorator)

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾器模式Decorator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java 8實(shí)現(xiàn)任意參數(shù)的單鏈表

    Java 8實(shí)現(xiàn)任意參數(shù)的單鏈表

    這篇文章主要為大家詳細(xì)介紹了Java 8實(shí)現(xiàn)任意參數(shù)的單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤問(wèn)題及解決思路(二)

    SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤問(wèn)題及解決思路(二)

    本文主要給大家介紹如何實(shí)現(xiàn)子線程中的traceId日志跟蹤,本文通過(guò)封裝Callable為例給大家介紹的非常詳細(xì),需要的朋友一起看看吧
    2021-05-05

最新評(píng)論

团风县| 兴安县| 长治县| 岐山县| 巫山县| 蕉岭县| 沙田区| 松桃| 林西县| 固原市| 土默特右旗| 晋江市| 贞丰县| 丰都县| 泸水县| 珠海市| 乐平市| 九龙坡区| 乌兰县| 绿春县| 五河县| 民县| 宁化县| 海兴县| 泾川县| 渑池县| 岳西县| 称多县| 万荣县| 崇州市| 哈密市| 湖州市| 方正县| 勃利县| 潜江市| 报价| 溆浦县| 巨鹿县| 佛山市| 石渠县| 晋中市|