文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring动态添加定时任务的实现方法

2023-06-20 15:09

关注

本篇内容主要讲解“Spring动态添加定时任务的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring动态添加定时任务的实现方法”吧!

一、背景

在工作中,有些时候我们有些定时任务的执行可能是需要动态修改的,比如: 生成报表,有些项目配置每天的8点生成,有些项目配置每天的10点生成,像这种动态的任务执行时间,在不考虑分布式执行的情况下,我们可以
使用 Spring Task来简单的实现。

二、需求和实现思路

能够动态的添加一个定时任务。

Spring中存在一个类ThreadPoolTaskScheduler,它可以实现根据一个cron表达式来调度一个任务,并返回一个ScheduledFuture对象。

Spring动态添加定时任务的实现方法

能够取消定时任务的执行。

通过调用上一步的ScheduledFuturecancel方法,就可以将这个任务取消。

动态的修改任务执行的时间。

先取消任务。然后在重新注册一个任务。

获取定时任务执行的异常

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;@Component@Slf4jpublic 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动态添加定时任务的实现方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯