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

關(guān)于@Scheduled注解的任務(wù)為什么不執(zhí)行的問題

 更新時間:2022年09月30日 15:35:39   作者:融極  
這篇文章主要介紹了關(guān)于@Scheduled注解的任務(wù)為什么不執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

概述

在SpringBoot中可以通過@Scheduled來注解定義一個定時任務(wù),但是有時候你可能發(fā)現(xiàn)有的定時任務(wù)道理時間卻沒有執(zhí)行,但是又不是每次都不執(zhí)行,為什么呢???

舉例說明

下面這段diam定義了一個沒隔10s執(zhí)行一次的定時任務(wù):

package com.study.practice.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
?* @Description : schedule測試
?* @Version : V1.0.0
?* @Date : 2021/12/1 11:22
?*/
@Component
@Slf4j
public class ScheduleTest {
? ? @Scheduled(cron = "0/10 * * * * ?")
? ? public void execute() {
? ? ? ? log.info("Scheduled task is running ... ...");
? ? }
}

記得在啟動類或者Configuration類上添加了@EnableScheduling注解。

啟動應(yīng)用,控制臺每隔10秒打印一條日志:

2021-12-01 11:27:00.002  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:27:10.001  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:27:20.002  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:27:30.001  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:27:40.002  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:27:50.001  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:28:00.002  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:28:10.002  INFO 97876 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...

但是,問題才剛剛開始。

在上面的相關(guān)代碼中,我們使用cron表達式指定的定時任務(wù)執(zhí)行時間點從0秒開始,每隔10s執(zhí)行一次,現(xiàn)在我們再加一個定時任務(wù):

package com.study.practice.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
?* @Description : schedule測試
?* @Version : V1.0.0
?* @Date : 2021/12/1 11:22
?*/
@Component
@Slf4j
public class ScheduleTestTwo {
? ? @Scheduled(cron = "0/10 * * * * *")
? ? public void second() throws InterruptedException {
? ? ? ? log.info("Second scheduled task is running... ...");
? ? ? ? TimeUnit.SECONDS.sleep(5);
? ? }
}

啟動項目,執(zhí)行結(jié)果如下:

2021-12-01 11:36:30.001  INFO 134576 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:36:30.002  INFO 134576 --- [   scheduling-1] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 11:36:40.002  INFO 134576 --- [   scheduling-1] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 11:36:45.002  INFO 134576 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:36:50.001  INFO 134576 --- [   scheduling-1] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 11:36:55.002  INFO 134576 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 11:37:00.001  INFO 134576 --- [   scheduling-1] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 11:37:05.001  INFO 134576 --- [   scheduling-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...

可以看到任務(wù)1和任務(wù)2本該都是每個10s執(zhí)行,但是卻發(fā)現(xiàn)只有任務(wù)2執(zhí)行了,任務(wù)1卻等待了5s之后才執(zhí)行。

原因分析

為了找到原因,我們從@Scheduled注解的源碼開始分析:

下面是@Scheduled注解的注釋:

?*
?* <p>Processing of {@code @Scheduled} annotations is performed by
?* registering a {@link ScheduledAnnotationBeanPostProcessor}. This can be
?* done manually or, more conveniently, through the {@code <task:annotation-driven/>}
?* element or @{@link EnableScheduling} annotation.
?*

劃重點, 每一個有@Scheduled注解的方法都會被注冊為一個ScheduledAnnotationBeanPostProcessor, 再接著往下看ScheduledAnnotationBeanPostProcessor:

?? ?/**
?? ? * Set the {@link org.springframework.scheduling.TaskScheduler} that will invoke
?? ? * the scheduled methods, or a {@link java.util.concurrent.ScheduledExecutorService}
?? ? * to be wrapped as a TaskScheduler.
?? ? * <p>If not specified, default scheduler resolution will apply: searching for a
?? ? * unique {@link TaskScheduler} bean in the context, or for a {@link TaskScheduler}
?? ? * bean named "taskScheduler" otherwise; the same lookup will also be performed for
?? ? * a {@link ScheduledExecutorService} bean. If neither of the two is resolvable,
?? ? * a local single-threaded default scheduler will be created within the registrar.
?? ? * @see #DEFAULT_TASK_SCHEDULER_BEAN_NAME
?? ? */
?? ?public void setScheduler(Object scheduler) {
?? ??? ?this.scheduler = scheduler;
?? ?}

重點來了,注意這句話:

if neither of two is resolvable, a local single-thread default scheduler will be created within in the registrar.

這句話意味著,如果我們不主動配置我們需要的TaskScheduler,SpringBoot會默認使用一個單線程的scheduler來處理我們用@Scheduled注解實現(xiàn)的定時任務(wù),到此我們剛才的問題就可以理解了。

因為是單個線程執(zhí)行所有的定時任務(wù),所有task2如果先執(zhí)行,因為執(zhí)行中等待了5s,所以task2執(zhí)行完后,task1接著繼續(xù)執(zhí)行。

解決方案

搞清楚這個流程后,解決這個問題就很簡單了。

根據(jù)剛才注釋的描述,我們只需要提供一個滿足自己需要的TaskScheduler并注冊到context容器中就可以了。

package com.study.practice.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

/**
?* @Description : scheduler配置類
?* @Version : V1.0.0
?* @Date : 2021/12/1 14:00
?*/
@Configuration
public class ScheduledTaskConfig implements SchedulingConfigurer {
? ? @Override
? ? public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
? ? ? ? ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
? ? ? ? taskScheduler.setPoolSize(2);
? ? ? ? taskScheduler.initialize();
? ? ? ? taskRegistrar.setTaskScheduler(taskScheduler);
? ? }
}

上面的代碼提供了一個線程池大小為2的taskScheduler,再次啟動SpringBoot查看效果。

2021-12-01 14:05:20.001  INFO 39768 --- [TaskScheduler-2] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 14:05:20.001  INFO 39768 --- [TaskScheduler-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 14:05:30.002  INFO 39768 --- [TaskScheduler-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 14:05:30.002  INFO 39768 --- [TaskScheduler-2] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...
2021-12-01 14:05:40.001  INFO 39768 --- [TaskScheduler-1] c.study.practice.schedule.ScheduleTest   : Scheduled task is running ... ...
2021-12-01 14:05:40.001  INFO 39768 --- [TaskScheduler-2] c.s.practice.schedule.ScheduleTestTwo    : Second scheduled task is running... ...

可以看到,當線程池里有兩個線程時,這兩個任務(wù)各種按照預(yù)定的時間進行觸發(fā),互不影響了。

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

相關(guān)文章

  • Mybatis輸入輸出映射及動態(tài)SQL Review

    Mybatis輸入輸出映射及動態(tài)SQL Review

    這篇文章主要介紹了Mybatis輸入輸出映射及動態(tài)SQL Review,需要的朋友可以參考下
    2017-02-02
  • Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    本文介紹了解決Spring Boot前端Vue跨域問題的實戰(zhàn)經(jīng)驗,并提供了后端和前端的配置示例,通過配置后端和前端,我們可以輕松解決跨域問題,實現(xiàn)正常的前后端交互,需要的朋友可以參考下
    2023-09-09
  • SpringBoot自動配置原理詳解

    SpringBoot自動配置原理詳解

    SpringBoot的誕生就是為了簡化Spring中繁瑣的XML配置,其本質(zhì)依然還是Spring框架,使用SpringBoot之后可以不使用任何XML配置來啟動一個服務(wù),使得我們在使用微服務(wù)架構(gòu)時可以更加快速的建立一個應(yīng)用。本文將為具體介紹一下SpringBoot的原理,需要的可以參考一下
    2021-12-12
  • 小白教程! Linux服務(wù)器上JDK安裝配置方法

    小白教程! Linux服務(wù)器上JDK安裝配置方法

    這篇文章主要為大家詳細介紹了Linux服務(wù)器上JDK安裝配置方法,小白教程!具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 關(guān)于@Controller和@Restcontroller的那點奇葩事

    關(guān)于@Controller和@Restcontroller的那點奇葩事

    這篇文章主要介紹了關(guān)于@Controller和@Restcontroller的那點奇葩事,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Mybatis單個參數(shù)的if判斷報異常There is no getter for property named ''xxx'' in ''class java.lang.Integer''的解決方案

    Mybatis單個參數(shù)的if判斷報異常There is no getter for property named ''x

    今天小編就為大家分享一篇關(guān)于Mybatis單個參數(shù)的if判斷報異常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 使用springboot aop來實現(xiàn)讀寫分離和事物配置

    使用springboot aop來實現(xiàn)讀寫分離和事物配置

    這篇文章主要介紹了使用springboot aop來實現(xiàn)讀寫分離和事物配置,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • java中Pulsar?InterruptedException?異常

    java中Pulsar?InterruptedException?異常

    這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • MyBatis流式查詢的項目實踐

    MyBatis流式查詢的項目實踐

    本文主要介紹了MyBatis流式查詢的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效

    重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效

    這篇文章主要介紹了重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論

裕民县| 常州市| 攀枝花市| 清徐县| 庄河市| 赤水市| 绍兴县| 山阴县| 盐山县| 常德市| 兴隆县| 通江县| 和林格尔县| 固始县| 太仆寺旗| 兴隆县| 芜湖县| 阳城县| 兴城市| 淮阳县| 宜章县| 双柏县| 房产| 吉林市| 镇赉县| 左云县| 油尖旺区| 新巴尔虎左旗| 清远市| 大余县| 兖州市| 济源市| 金溪县| 阿瓦提县| 肇源县| 桃园县| 从化市| 双鸭山市| 兰坪| 昌邑市| 江北区|