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

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

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

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

項目中用到了定時任務(wù)往前端推送數(shù)據(jù),間隔2秒 @Scheduled(cron = "0/2 * * * * ? "),測試發(fā)現(xiàn),每次任務(wù)執(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的默認(rèn)線程池配置,其線程池的線程數(shù)默認(rèn)為1,也就是說默認(rèn)情況下,Spring用來處理定時任務(wù)的線程只有一個。

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

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

解決法案

是初始一個定時任務(wù)執(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));
?
? ? }
}

再次測試,跟設(shè)置的間隔時間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

定時任務(wù)@Scheduled入門

一個最簡單的例子

啟動類添加注解

@EnableScheduling // 開啟定時任務(wù)

編寫單線程demo

cron 表達(dá)式

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

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

多線程

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

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

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

@Async

就是說你這次失敗了, 不要影響我下次的運(yùn)行

總結(jié)

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

相關(guān)文章

最新評論

海城市| 宁阳县| 图片| 兴业县| 杭锦旗| 荃湾区| 多伦县| 廊坊市| 伊宁市| 扬州市| 伊宁市| 肇庆市| 长兴县| 会宁县| 琼中| 盐池县| 东方市| 宜兰县| 顺昌县| 民丰县| 石楼县| 青岛市| 灌云县| 南岸区| 巴青县| 鄂尔多斯市| 托里县| 元朗区| 沧州市| 维西| 同心县| 响水县| 乌鲁木齐县| 泰和县| 常德市| 武城县| 双城市| 博湖县| 仁化县| 奇台县| 伊川县|