中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring動態添加定時任務的實現方法

發布時間:2021-07-10 13:37:12 來源:億速云 閱讀:169 作者:chen 欄目:開發技術

本篇內容主要講解“Spring動態添加定時任務的實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring動態添加定時任務的實現方法”吧!

一、背景

在工作中,有些時候我們有些定時任務的執行可能是需要動態修改的,比如: 生成報表,有些項目配置每天的8點生成,有些項目配置每天的10點生成,像這種動態的任務執行時間,在不考慮分布式執行的情況下,我們可以
使用 Spring Task來簡單的實現。

二、需求和實現思路

1、能夠動態的添加一個定時任務。

Spring中存在一個類ThreadPoolTaskScheduler,它可以實現根據一個cron表達式來調度一個任務,并返回一個ScheduledFuture對象。

Spring動態添加定時任務的實現方法

2、能夠取消定時任務的執行。

通過調用上一步的ScheduledFuturecancel方法,就可以將這個任務取消。

3、動態的修改任務執行的時間。

先取消任務。然后在重新注冊一個任務。

4、獲取定時任務執行的異常

ThreadPoolTaskScheduler類中有一個設置ErrorHandler的方法,給自己實現的ErrorHandler即可。

Spring動態添加定時任務的實現方法

提示:

  1. Spring中我們通過@Scheduled注解來實現的定時任務,底層也是通過ThreadPoolTaskScheduler來實現的。可以通過ScheduledAnnotationBeanPostProcessor類來查看。

  2. ThreadPoolTaskScheduler的默認線程數是1,這個需要根據實際的情況進行修改。

三、代碼實現

此處只給出動態注冊定時任務和取消的定時任務的代碼。

package com.huan.study.task.jobs.tasks;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronExpression;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * @author huan.fu 2021/7/8 - 下午2:46
 */
@Component
@Slf4j
public class DynamicCronTask implements InitializingBean {

    @Autowired
    private ThreadPoolTaskScheduler taskScheduler;


    private ScheduledFuture<?> scheduledFuture;

    @Override
    public void afterPropertiesSet() throws Exception {
        // 動態啟動一個定時任務
        log.info("注冊一個定時任務:每隔1秒執行一次");
        scheduledFuture = register("* * * * * ?");

        // 取消一個調度
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
                log.info("取消調度");
                scheduledFuture.cancel(false);
                log.info("取消結果:" + scheduledFuture.isCancelled());
                log.info("重新注冊一個定時任務:每隔2秒執行一次");
                register("*/2 * * * * ?");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

    private ScheduledFuture<?> register(String cron) {

        // 高版本使用 CronExpression,低版本使用 CronSequenceGenerator
        boolean validExpression = CronExpression.isValidExpression(cron);
        log.info("cron:[{}]是合法的嗎:[{}]", cron, validExpression);

        CronExpression expression = CronExpression.parse(cron);
        LocalDateTime nextExecTime = expression.next(LocalDateTime.now());
        if (null != nextExecTime) {
            log.info("定時任務下次執行的時間為:[{}]", nextExecTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }

        return taskScheduler.schedule(new Runnable() {
            @Override
            public void run() {
                log.info("我執行了");
            }
        }, new CronTrigger(cron));
    }
}

四、執行結果

Spring動態添加定時任務的實現方法

五、完整代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-task

到此,相信大家對“Spring動態添加定時任務的實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万全县| SHOW| 蒲城县| 宁海县| 安福县| 兴文县| 蓝山县| 新安县| 镇赉县| 盐池县| 宁化县| 静乐县| 九龙坡区| 沙洋县| 车致| 东莞市| 时尚| 和林格尔县| 洱源县| 扎赉特旗| 横峰县| 福海县| 陵川县| 沛县| 淳安县| 巴林左旗| 舞钢市| 连云港市| 苏州市| 离岛区| 台中市| 英吉沙县| 同德县| 临潭县| 泸州市| 谷城县| 樟树市| 凌源市| 罗江县| 抚顺市| 姚安县|