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

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

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

一、背景

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

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

1、能夠動(dòng)態(tài)的添加一個(gè)定時(shí)任務(wù)。

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

可以看到返回值是ScheduledFuture對象

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

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

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

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

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

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

定時(shí)任務(wù)錯(cuò)誤處理

提示:

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

三、代碼實(shí)現(xiàn)

此處只給出動(dòng)態(tài)注冊定時(shí)任務(wù)和取消的定時(shí)任務(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 {
        // 動(dòng)態(tài)啟動(dòng)一個(gè)定時(shí)任務(wù)
        log.info("注冊一個(gè)定時(shí)任務(wù):每隔1秒執(zhí)行一次");
        scheduledFuture = register("* * * * * ?");

        // 取消一個(gè)調(diào)度
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
                log.info("取消調(diào)度");
                scheduledFuture.cancel(false);
                log.info("取消結(jié)果:" + scheduledFuture.isCancelled());
                log.info("重新注冊一個(gè)定時(shí)任務(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("定時(shí)任務(wù)下次執(zhí)行的時(shí)間為:[{}]", 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動(dòng)態(tài)添加定時(shí)任務(wù)的實(shí)現(xiàn)思路的文章就介紹到這了,更多相關(guān)Spring定時(shí)任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論