欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring動態(tài)添加定時任務的實現(xiàn)思路

 更新時間:2021年07月10日 10:37:12   作者:huan_1993  
這篇文章主要介紹了Spring動態(tài)添加定時任務的實現(xiàn)思路,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、背景

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

二、需求和實現(xiàn)思路

1、能夠動態(tài)的添加一個定時任務。

Spring中存在一個類ThreadPoolTaskScheduler,它可以實現(xiàn)根據(jù)一個cron表達式來調(diào)度一個任務,并返回一個ScheduledFuture對象。

可以看到返回值是ScheduledFuture對象

2、能夠取消定時任務的執(zhí)行。

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

3、動態(tài)的修改任務執(zhí)行的時間。

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

4、獲取定時任務執(zhí)行的異常

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

定時任務錯誤處理

提示:

  1. Spring中我們通過@Scheduled注解來實現(xiàn)的定時任務,底層也是通過ThreadPoolTaskScheduler來實現(xiàn)的??梢酝ㄟ^ScheduledAnnotationBeanPostProcessor類來查看。
  2. ThreadPoolTaskScheduler的默認線程數(shù)是1,這個需要根據(jù)實際的情況進行修改。

三、代碼實現(xiàn)

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

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 {
        // 動態(tài)啟動一個定時任務
        log.info("注冊一個定時任務:每隔1秒執(zhí)行一次");
        scheduledFuture = register("* * * * * ?");

        // 取消一個調(diào)度
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
                log.info("取消調(diào)度");
                scheduledFuture.cancel(false);
                log.info("取消結(jié)果:" + scheduledFuture.isCancelled());
                log.info("重新注冊一個定時任務:每隔2秒執(zhí)行一次");
                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("定時任務下次執(zhí)行的時間為:[{}]", nextExecTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }

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

四、執(zhí)行結(jié)果

執(zhí)行結(jié)果

五、完整代碼

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

到此這篇關于Spring動態(tài)添加定時任務的實現(xiàn)思路的文章就介紹到這了,更多相關Spring定時任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • intellij idea 將模塊打jar包的步驟詳解

    intellij idea 將模塊打jar包的步驟詳解

    這篇文章主要介紹了intellij idea 將模塊打jar包的步驟,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • IDEA項目打包的幾種方式總結(jié)

    IDEA項目打包的幾種方式總結(jié)

    這篇文章主要介紹了IDEA項目打包的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java虛擬機JVM類加載機制原理(面試必問)

    java虛擬機JVM類加載機制原理(面試必問)

    這篇文章主要介紹了面試當中必會問到的java虛擬機JVM類加載機制,非常的詳細,有需要的朋友可以借鑒參考下,歡迎多多交流討論
    2021-08-08
  • mybatis中關于type-aliases-package的使用

    mybatis中關于type-aliases-package的使用

    這篇文章主要介紹了mybatis中關于type-aliases-package的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 使用ScheduledThreadPoolExecutor踩過最痛的坑

    使用ScheduledThreadPoolExecutor踩過最痛的坑

    這篇文章主要介紹了使用ScheduledThreadPoolExecutor踩過最痛的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 淺析Java內(nèi)存模型與垃圾回收

    淺析Java內(nèi)存模型與垃圾回收

    下面小編就為大家?guī)硪黄獪\析Java內(nèi)存模型與垃圾回收。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-05-05
  • java 利用java反射機制動態(tài)加載類的簡單實現(xiàn)

    java 利用java反射機制動態(tài)加載類的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄猨ava 利用java反射機制動態(tài)加載類的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringCloud實戰(zhàn)之Feign聲明式服務調(diào)用

    SpringCloud實戰(zhàn)之Feign聲明式服務調(diào)用

    這篇文章主要介紹了SpringCloud實戰(zhàn)之Feign聲明式服務調(diào)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java實現(xiàn)郵件找回密碼功能

    Java實現(xiàn)郵件找回密碼功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)郵件找回密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Spring注解驅(qū)動之BeanFactoryPostProcessor原理解析

    Spring注解驅(qū)動之BeanFactoryPostProcessor原理解析

    這篇文章主要介紹了Spring注解驅(qū)動之BeanFactoryPostProcessor原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論