我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么用SpringBoot实现动态添加定时任务功能

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么用SpringBoot实现动态添加定时任务功能

这篇“怎么用SpringBoot实现动态添加定时任务功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用SpringBoot实现动态添加定时任务功能”文章吧。

最近的需求有一个自动发布的功能, 需要做到每次提交都要动态的添加一个定时任务

怎么用SpringBoot实现动态添加定时任务功能

代码结构

怎么用SpringBoot实现动态添加定时任务功能

1. 配置类

package com.orion.ops.config; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.TaskScheduler;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@EnableScheduling@Configurationpublic class SchedulerConfig {    @Bean    public TaskScheduler taskScheduler() {        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();        scheduler.setPoolSize(4);        scheduler.setRemoveOnCancelPolicy(true);        scheduler.setThreadNamePrefix("scheduling-task-");        return scheduler;    }}

2. 定时任务类型枚举

package com.orion.ops.handler.scheduler; import com.orion.ops.consts.Const;import com.orion.ops.handler.scheduler.impl.ReleaseTaskImpl;import com.orion.ops.handler.scheduler.impl.SchedulerTaskImpl;import lombok.AllArgsConstructor;import java.util.function.Function;@AllArgsConstructorpublic enum TaskType {        RELEASE(id -> new ReleaseTaskImpl((Long) id)) {        @Override        public String getKey(Object params) {            return Const.RELEASE + "-" + params;        }    },     * 调度任务    SCHEDULER_TASK(id -> new SchedulerTaskImpl((Long) id)) {            return Const.TASK + "-" + params;    ;    private final Function<Object, Runnable> factory;     * 创建任务     *     * @param params params     * @return task    public Runnable create(Object params) {        return factory.apply(params);    }     * 获取 key     * @return key    public abstract String getKey(Object params);}

这个枚举的作用是生成定时任务的 runnable 和 定时任务的唯一值, 方便后续维护

3. 实际执行任务实现类

package com.orion.ops.handler.scheduler.impl; import com.orion.ops.service.api.ApplicationReleaseService;import com.orion.spring.SpringHolder;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class ReleaseTaskImpl implements Runnable {    protected static ApplicationReleaseService applicationReleaseService = SpringHolder.getBean(ApplicationReleaseService.class);    private Long releaseId;    public ReleaseTaskImpl(Long releaseId) {        this.releaseId = releaseId;    }    @Override    public void run() {        log.info("定时执行发布任务-触发 releaseId: {}", releaseId);        applicationReleaseService.runnableAppRelease(releaseId, true);}

4. 定时任务包装器

package com.orion.ops.handler.scheduler; import org.springframework.scheduling.TaskScheduler;import org.springframework.scheduling.Trigger;import java.util.Date;import java.util.concurrent.ScheduledFuture;public class TimedTask {        private Runnable runnable;     * 异步执行    private volatile ScheduledFuture<?> future;    public TimedTask(Runnable runnable) {        this.runnable = runnable;    }     * 提交任务 一次性     *     * @param scheduler scheduler     * @param time      time    public void submit(TaskScheduler scheduler, Date time) {        this.future = scheduler.schedule(runnable, time);     * 提交任务 cron表达式     * @param trigger   trigger    public void submit(TaskScheduler scheduler, Trigger trigger) {        this.future = scheduler.schedule(runnable, trigger);     * 取消定时任务    public void cancel() {        if (future != null) {            future.cancel(true);        }}

这个类的作用是包装实际执行任务, 以及提供调度器的执行方法

5. 任务注册器 (核心)

package com.orion.ops.handler.scheduler; import com.orion.ops.consts.MessageConst;import com.orion.utils.Exceptions;import com.orion.utils.collect.Maps;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.scheduling.TaskScheduler;import org.springframework.scheduling.support.CronTrigger;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.Date;import java.util.Map;@Componentpublic class TaskRegister implements DisposableBean {    private final Map<String, TimedTask> taskMap = Maps.newCurrentHashMap();    @Resource    @Qualifier("taskScheduler")    private TaskScheduler scheduler;        public void submit(TaskType type, Date time, Object params) {        // 获取任务        TimedTask timedTask = this.getTask(type, params);        // 执行任务        timedTask.submit(scheduler, time);    }     * @param cron   cron    public void submit(TaskType type, String cron, Object params) {        timedTask.submit(scheduler, new CronTrigger(cron));     * 获取任务    private TimedTask getTask(TaskType type, Object params) {        // 生成任务        Runnable runnable = type.create(params);        String key = type.getKey(params);        // 判断是否存在任务        if (taskMap.containsKey(key)) {            throw Exceptions.init(MessageConst.TASK_PRESENT);        }        TimedTask timedTask = new TimedTask(runnable);        taskMap.put(key, timedTask);        return timedTask;     * 取消任务    public void cancel(TaskType type, Object params) {        TimedTask task = taskMap.get(key);        if (task != null) {            taskMap.remove(key);            task.cancel();     * 是否存在    public boolean has(TaskType type, Object params) {        return taskMap.containsKey(type.getKey(params));    @Override    public void destroy() {        taskMap.values().forEach(TimedTask::cancel);        taskMap.clear();}

这个类提供了执行, 提交任务的api, 实现 DisposableBean 接口, 便于在bean销毁时将任务一起销毁

6. 使用

    @Resource    private TaskRegister taskRegister;            @RequestMapping("/submit")    @EventLog(EventType.SUBMIT_RELEASE)    public Long submitAppRelease(@RequestBody ApplicationReleaseRequest request) {        Valid.notBlank(request.getTitle());        Valid.notNull(request.getAppId());        Valid.notNull(request.getProfileId());        Valid.notNull(request.getBuildId());        Valid.notEmpty(request.getMachineIdList());        TimedReleaseType timedReleaseType = Valid.notNull(TimedReleaseType.of(request.getTimedRelease()));        if (TimedReleaseType.TIMED.equals(timedReleaseType)) {            Date timedReleaseTime = Valid.notNull(request.getTimedReleaseTime());            Valid.isTrue(timedReleaseTime.compareTo(new Date()) > 0, MessageConst.TIMED_GREATER_THAN_NOW);        }        // 提交        Long id = applicationReleaseService.submitAppRelease(request);        // 提交任务            taskRegister.submit(TaskType.RELEASE, request.getTimedReleaseTime(), id);        return id;    }

以上就是关于“怎么用SpringBoot实现动态添加定时任务功能”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

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

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

怎么用SpringBoot实现动态添加定时任务功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用SpringBoot实现动态添加定时任务功能

这篇“怎么用SpringBoot实现动态添加定时任务功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用SpringBo
2023-06-29

django怎么动态添加定时任务

在Django中,可以使用celery来实现动态添加定时任务。首先,需要安装Celery:```shellpip install celery```然后,在Django的settings.py文件中配置Celery:```python# s
2023-09-26

SpringBoot定时任务功能怎么实现

本篇内容介绍了“SpringBoot定时任务功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 背景项目中需要一个可以动态新增定时
2023-06-30

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

本篇内容主要讲解“Spring动态添加定时任务的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring动态添加定时任务的实现方法”吧!一、背景在工作中,有些时候我们有些定时任务的执行
2023-06-20

SpringBoot动态定时任务如何实现

这篇文章主要介绍了SpringBoot动态定时任务如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot动态定时任务如何实现文章都会有所收获,下面我们一起来看看吧。 执行定时任务的线程池配置
2023-07-05

SpringBoot动态定时任务实现完整版

最近有幸要开发个动态定时任务,这里简单再梳理一下,下面这篇文章主要给大家介绍了关于SpringBoot动态定时任务实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-02-23

如何使用Python Celery动态添加定时任务

本篇内容介绍了“如何使用Python Celery动态添加定时任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、背景实际工作中会有一些耗
2023-07-06

SpringBoot实现动态定时任务的示例代码

在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务,感兴趣的可以了解一下
2022-11-13

SpringBoot定时任务怎么实现

这篇文章主要讲解了“SpringBoot定时任务怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot定时任务怎么实现”吧!SpringBoot定时任务主要由两个注解完成
2023-06-05

SpringBoot怎么使用Schedule实现定时任务

本文小编为大家详细介绍“SpringBoot怎么使用Schedule实现定时任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么使用Schedule实现定时任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录