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

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

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

一、背景

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

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

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

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

可以看到返回值是ScheduledFuture對象

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

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

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

先取消任務(wù)。然后在重新注冊一個任務(wù)。

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

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

定時任務(wù)錯誤處理

提示:

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

三、代碼實現(xiàn)

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

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)啟動一個定時任務(wù)
        log.info("注冊一個定時任務(wù):每隔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("重新注冊一個定時任務(wù):每隔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("定時任務(wù)下次執(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

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

相關(guān)文章

  • JAVA返回PDF文件流并進行下載的實現(xiàn)方法

    JAVA返回PDF文件流并進行下載的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于JAVA返回PDF文件流并進行下載的實現(xiàn)方法,PDF文件流下載是通過HTTP協(xié)議將服務(wù)器上的PDF文件以流的方式發(fā)送給客戶端,供客戶端保存到本地磁盤或直接在瀏覽器中打開,需要的朋友可以參考下
    2024-02-02
  • 淺析Java中Map與HashMap,Hashtable,HashSet的區(qū)別

    淺析Java中Map與HashMap,Hashtable,HashSet的區(qū)別

    HashMap和Hashtable兩個類都實現(xiàn)了Map接口,二者保存K-V對(key-value對);HashSet則實現(xiàn)了Set接口,性質(zhì)類似于集合
    2013-09-09
  • MyBatisPlus查詢報錯Unknow?column?‘id‘?in?‘field?list‘解決分析

    MyBatisPlus查詢報錯Unknow?column?‘id‘?in?‘field?list‘解決分析

    這篇文章主要為大家介紹了MyBatisPlus查詢報錯Unknow?column?‘id‘?in?‘field?list‘解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • JSON,AJAX,Maven入門基礎(chǔ)

    JSON,AJAX,Maven入門基礎(chǔ)

    這篇文章主要介紹了JSON,AJAX和Maven基礎(chǔ),如何使用AJAX讀取Json數(shù)組里面的數(shù)據(jù),感興趣的小伙伴們可以參考一下,希望能夠幫助到你
    2021-07-07
  • java中實體類和JSON對象之間相互轉(zhuǎn)化

    java中實體類和JSON對象之間相互轉(zhuǎn)化

    Java中關(guān)于Json格式轉(zhuǎn)化Object,Map,Collection類型和String類型之間的轉(zhuǎn)化在我們實際項目中應(yīng)用的很是普遍和廣泛。最近工作的過程中也是經(jīng)常有,因此,自己封裝了一個類分享給大家。
    2015-05-05
  • Java建造者設(shè)計模式詳解

    Java建造者設(shè)計模式詳解

    這篇文章主要為大家詳細介紹了Java建造者設(shè)計模式,對建造者設(shè)計模式進行分析理解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Spring多線程事務(wù)處理解決方案

    Spring多線程事務(wù)處理解決方案

    這篇文章主要介紹了Spring多線程事務(wù)處理,本文主要介紹了spring多線程事務(wù)的解決方案,心急的小伙伴可以跳過上面的理論介紹分析部分直接看最終解決方案,需要的朋友可以參考下
    2024-03-03
  • java編程實現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    java編程實現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    這篇文章主要介紹了java編程實現(xiàn)屏幕截圖(截屏)代碼,結(jié)合3個實例總結(jié)分析了Java截屏?xí)r頁面抓取及圖片保存的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Java中的異常處理之try-catch使用詳解

    Java中的異常處理之try-catch使用詳解

    這篇文章主要介紹了Java中的異常處理之try-catch使用的相關(guān)資料,包括異常的概念、try-catch語句的基本結(jié)構(gòu)、使用示例、多個catch塊的使用、try-catch-finally的執(zhí)行順序、try-with-resources語句以及總結(jié),需要的朋友可以參考下
    2024-12-12
  • mybatisPlus實現(xiàn)邏輯刪除,自動生成創(chuàng)建時間和更新時間方式

    mybatisPlus實現(xiàn)邏輯刪除,自動生成創(chuàng)建時間和更新時間方式

    MyBatisPlus框架中,通過@TableField(fill=FieldFill.INSERT)和@TableField(fill=FieldFill.UPDATE)注解可以實現(xiàn)在插入和更新時自動填充字段,比如創(chuàng)建時間和更新時間,使用@TableLogic注解標識邏輯刪除字段
    2024-09-09

最新評論

尉犁县| 兴安盟| 南安市| 黄浦区| 航空| 鄂尔多斯市| 洛隆县| 辽阳市| 顺昌县| 大埔区| 大城县| 固阳县| 兴隆县| 原阳县| 中方县| 蕉岭县| 徐闻县| 醴陵市| 周口市| 佛冈县| 麻城市| 金寨县| 安泽县| 元阳县| 会东县| 灵山县| 北安市| 康平县| 申扎县| 资中县| 邮箱| 白河县| 海口市| 阿拉善右旗| 河北省| 益阳市| 扎赉特旗| 普定县| 朝阳市| 长寿区| 屯门区|