亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

原因

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

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

而項(xiàng)目中還有數(shù)個(gè)定時(shí)任務(wù)。

解決法案

是初始一個(gè)定時(shí)任務(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));
?
? ? }
}

再次測(cè)試,跟設(shè)置的間隔時(shí)間2秒一致。

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

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

一個(gè)最簡單的例子

啟動(dòng)類添加注解

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

編寫單線程demo

cron 表達(dá)式

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

fixedDelay

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

fixedRate

 /**
     *  fixedRate:
     *  每隔2秒就會(huì)執(zhí)行, 但是因?yàn)閱尉€程,所以在5秒后會(huì)輸出,間隔就是5秒
     * @throws InterruptedException
     */
    @Scheduled(fixedRate = 2000L)
    public void test3() throws InterruptedException {
        Thread.sleep(5000L);
        log.info("定時(shí)任務(wù)測(cè)試fixedRate:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

如果是一起執(zhí)行這三個(gè)定時(shí)任務(wù),那么會(huì)一個(gè)一個(gè)的來, 因?yàn)橹挥幸粋€(gè)線程.

多線程

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

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

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

@Async

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

總結(jié)

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

相關(guān)文章

最新評(píng)論