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

解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析

 更新時間:2023年04月24日 10:31:07   作者:321茄子  
這篇文章主要介紹了解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

定時任務@Scheduled沒有準時執(zhí)行的原因

項目中用到了定時任務往前端推送數(shù)據(jù),間隔2秒 @Scheduled(cron = "0/2 * * * * ? "),測試發(fā)現(xiàn),每次任務執(zhí)行并不是2秒,而是1-5秒之間。

執(zhí)行時間:::::Wed Nov 30 16:20:19 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:20:20 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:20:24 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:20:29 CST 2022

原因

了解發(fā)現(xiàn),如果程序中沒有指定線程池的配置,也就是Spring的Scheduled的默認線程池配置,其線程池的線程數(shù)默認為1,也就是說默認情況下,Spring用來處理定時任務的線程只有一個。

如果有定時的處理時間占用時間比較長,那么就會導致下一個定時任務,即使到達了配置的定時時間,也不會立即執(zhí)行,而是等到前面一個任務處理完成了,才會進行處理。

而項目中還有數(shù)個定時任務。

解決法案

是初始一個定時任務執(zhí)行線程池

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
?
? ? @Override
? ? public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
? ? ? ? Method[] methods = BatchProperties.Job.class.getMethods();
? ? ? ? int defaultPoolSize = 10;
? ? ? ? int corePoolSize = 0;
? ? ? ? if (methods != null && methods.length > 0) {
? ? ? ? ? ? for (Method method : methods) {
? ? ? ? ? ? ? ? Scheduled annotation = method.getAnnotation(Scheduled.class);
? ? ? ? ? ? ? ? if (annotation != null) {
? ? ? ? ? ? ? ? ? ? corePoolSize++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if (defaultPoolSize > corePoolSize)
? ? ? ? ? ? ? ? corePoolSize = defaultPoolSize;
? ? ? ? }
? ? ? ? taskRegistrar.setScheduler(Executors.newScheduledThreadPool(corePoolSize));
?
? ? }
}

再次測試,跟設置的間隔時間2秒一致。

執(zhí)行時間:::::Wed Nov 30 16:48:32 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:48:34 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:48:36 CST 2022
執(zhí)行時間:::::Wed Nov 30 16:48:38 CST 2022

定時任務@Scheduled入門

一個最簡單的例子

啟動類添加注解

@EnableScheduling // 開啟定時任務

編寫單線程demo

cron 表達式

/**
     * cron 表達式
     * 每2秒執(zhí)行一次
     * @throws InterruptedException
     */
    @Scheduled(cron = "0/2 * * * * *")
    public void test() throws InterruptedException {
        // 經(jīng)過測試,使用cron表達式,定時任務第二次會等待第一次執(zhí)行完畢再開始!
        Thread.sleep(5000L);
        log.info("定時任務測試cron:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

fixedDelay

 /**
     *  fixedDelay:
     *  第一次執(zhí)行完畢才會執(zhí)行第二次,時間間隔變?yōu)榱?秒
     * @throws InterruptedException
     */
    @Scheduled(fixedDelay = 2000L)
    public void test2() throws InterruptedException {
        Thread.sleep(5000L);
        log.info("定時任務測試fixedDelay:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

fixedRate

 /**
     *  fixedRate:
     *  每隔2秒就會執(zhí)行, 但是因為單線程,所以在5秒后會輸出,間隔就是5秒
     * @throws InterruptedException
     */
    @Scheduled(fixedRate = 2000L)
    public void test3() throws InterruptedException {
        Thread.sleep(5000L);
        log.info("定時任務測試fixedRate:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

如果是一起執(zhí)行這三個定時任務,那么會一個一個的來, 因為只有一個線程.

多線程

/**
 *
 * @author GMaya
 */
@Configuration
@EnableAsync
public class ScheduleConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50); // 設置線程池大小
        return taskScheduler;
    }
}

如果只是加這一個配置類, 確實是使用了多線程, 每個定時任務都互相不影響.

但是一個線程第一次阻塞了,第二次就不行了,所以在定時任務上再加

@Async

就是說你這次失敗了, 不要影響我下次的運行

總結(jié)

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

相關(guān)文章

最新評論

日喀则市| 咸阳市| 平泉县| 德江县| 镇雄县| 司法| 龙胜| 施秉县| 金阳县| 东丰县| 宁陵县| 盐山县| 香河县| 准格尔旗| 珠海市| 商河县| 华阴市| 长汀县| 桐梓县| 吐鲁番市| 潞城市| 江华| 宁安市| 邯郸市| 洛南县| 崇文区| 深圳市| 杭锦旗| 西安市| 临江市| 五台县| 哈尔滨市| 泉州市| 萨嘎县| 安溪县| 旬邑县| 浮梁县| 潢川县| 西乌| 田东县| 海伦市|