您好,登錄后才能下訂單哦!
本篇內容主要講解“Spring動態添加定時任務的實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring動態添加定時任務的實現方法”吧!
在工作中,有些時候我們有些定時任務的執行可能是需要動態修改的,比如: 生成報表,有些項目配置每天的8點生成,有些項目配置每天的10點生成,像這種動態的任務執行時間,在不考慮分布式執行的情況下,我們可以
使用 Spring Task
來簡單的實現。
1、能夠動態的添加一個定時任務。
在Spring
中存在一個類ThreadPoolTaskScheduler
,它可以實現根據一個cron表達式
來調度一個任務,并返回一個ScheduledFuture
對象。
2、能夠取消定時任務的執行。
通過調用上一步的ScheduledFuture
的cancel
方法,就可以將這個任務取消。
3、動態的修改任務執行的時間。
先取消任務。然后在重新注冊一個任務。
4、獲取定時任務執行的異常
ThreadPoolTaskScheduler類中有一個設置ErrorHandler
的方法,給自己實現的ErrorHandler即可。
提示:
在Spring
中我們通過@Scheduled
注解來實現的定時任務,底層也是通過ThreadPoolTaskScheduler
來實現的。可以通過ScheduledAnnotationBeanPostProcessor
類來查看。
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)); } }
https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-task
到此,相信大家對“Spring動態添加定時任務的實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。