SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务

ThreadPoolTaskScheduler轻量级多线程定时任务框架 面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行schedule(Runnable task, Trigger trigger) corn表达式,周期执行。 阅读详情

最近做了一个需求:将定时任务保存到数据库中,并在页面上实现定时任务的开关,以及更新定时任务时间后重新创建定时任务。

于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。

在SpringBoot中提供的ThreadPoolTaskScheduler这个类,该类提供了一个schedule(Runnable task, Trigger trigger)的方法可以实现定时任务的创建,该方法是通过管理线程来实现。

schedule(Runnable task, Trigger trigger)源码:

java复制代码public ScheduledFuture schedule(Runnable task, Trigger trigger) {
            ScheduledExecutorService executor = getScheduledExecutor();
            try {
                    ErrorHandler errorHandler = this.errorHandler;
                    if (errorHandler == null) {
                            errorHandler = TaskUtils.getDefaultErrorHandler(true);
                    }
                    return new ReschedulingRunnable(task, trigger, executor, errorHandler).schedule();
            }
            catch (RejectedExecutionException ex) {
                    throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex);
            }
    }

上述源码中,首先会获取定时任务执行服务,即:ScheduledExecutorService executor = getScheduledExecutor(); ,然后创建重排线程类,并调用schedule() 方法来创建ScheduledFuture 。

在ScheduledFuture 中提供了cancel(boolean mayInterruptIfRunning) 来实现定时任务的删除。通过这两个方法,我们可以实现上述的需求。

废话不多说,代码撸起。

1、代码实现

1.1 定时任务线程配置

java复制代码/**
 * @author: jiangjs
 * @description: 需要添加ThreadPoolTaskScheduler线程池才能正常通过@Autowired/@Resource使用
 * @date: 2023/2/17 9:51
 **/
@Configuration
public class SchedulingTaskConfig {
    @Bean(name = "taskSchedulerPool")
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        //设置线程池大小
        taskScheduler.setPoolSize(60);
        //线程名称前缀
        taskScheduler.setThreadNamePrefix("task-pool-");
        //设置终止时等待最大时间,单位s,即在关闭时,需等待其他任务完成执行
        taskScheduler.setAwaitTerminationSeconds(3000);
        //设置关机时是否等待计划任务完成,不中断正在运行的任务并执行队列中的所有任务,默认false
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        return taskScheduler;
    }
}

1.2 获取类工具

java复制代码/**
 * @author: jiangjs
 * @description: 上下文获取类
 * @date: 2023/1/30 10:28
 **/
@Component
public class SpringContextUtils implements ApplicationContextAware {
    private static ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtils.context = applicationContext;
    }

    public static Object getBean(String name){
        return context.getBean(name);
    }
}

通过ApplicationContext中getBean通过类名来获取对应的类。

1.3 创建定时任务线程类

由于ThreadPoolTaskScheduler是基于线程来创建定时任务的,因此我们封装一个类来实现Runnable,其主要作用是获取数据参数,绑定定时任务类及定时任务方法,然后在通过反射拿到方法进行执行。参数则定义成泛型,便于直接传递,定时任务方法获取后不需要再次转换。

java复制代码import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.Objects;
/**
 * @author: jiangjs
 * @description: 实现定时任务线程
 * @date: 2023/2/16 15:31
 **/
@Slf4j
public class SchedulingTaskRunnable implements Runnable {
    /**
     * 其他参数
     */
    private final T t;
    /**
     * 定时任务类
     */
    private final String clazz;

    /**
     * 定时任务方法
     */
    private final String methodName;

    SchedulingTaskRunnable(T t,String clazz,String methodName){
        this.t = t;
        this.clazz = clazz;
        this.methodName = methodName;
    }

    @Override
    public void run() {
        Object bean = SpringContextUtils.getBean(clazz);
        Method method;
        try{
            method = Objects.nonNull(t) ? bean.getClass().getDeclaredMethod(methodName,t.getClass()) : bean.getClass().getDeclaredMethod(methodName);
            ReflectionUtils.makeAccessible(method);
            if (Objects.nonNull(t)){
                method.invoke(bean,t);
            } else {
                method.invoke(bean);
            }
        }catch (Exception e){
            log.error("获取方法信息报错:{}",e.getMessage());
        }
    }
}

1.4 封装管理定时任务工具

该工具主要实现定时任务的创建和删除方法,在创建定时任务时要先调用删除方法,确保当前任务是唯一的,因此在更新定时任务时间时,只需要调用创建方法即可。

其中定义了一个 ConcurrentHashMap<String, ScheduledFuture> ,主要作用是为了管理定时任务,通过自定义的任务名称或Id,获取到ScheduledFuture\来进行相关操作,例如:调用关闭方法。

java复制代码    import lombok.extern.slf4j.Slf4j;
    import org.apache.poi.ss.formula.functions.T;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;

    import java.util.Objects;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ScheduledFuture;

    /**
     * @author: jiangjs
     * @description: 定时任务管理方法
     * @date: 2023/2/16 15:48
     **/
    @Component
    @Slf4j
    public class SchedulingTaskManage {

        /**
         * 将任务放入map便于管理
         */
        private final ConcurrentHashMap<String, ScheduledFuture> cache = new ConcurrentHashMap<>();

        @Resource(name = "taskSchedulerPool")
        private ThreadPoolTaskScheduler threadPoolTaskScheduler;

        /**
         * 删除定时任务
         * @param key 自定义定时任务名称
         */
        public void stopSchedulingTask(String key){
            if (Objects.isNull(cache.get(key))){
                log.info(String.format(".......当前key【%s】没有定时任务......",key));
                return;
            }
            ScheduledFuture future = cache.get(key);
            if (Objects.nonNull(future)){
                //关闭当前定时任务
                future.cancel(Boolean.TRUE);
                cache.remove(key);
                log.info(String.format("删除【%s】对应定时任务成功",key));
            }
        }

        /**
         * 创建定时任务
         * @param key 任务key
         * @param runnable 当前线程
         * @param cron 定时任务cron
         */
        public void createSchedulingTask(String key,SchedulingTaskRunnable runnable, String cron){
            ScheduledFuture schedule = taskScheduler.schedule(runnable, new CronTrigger(cron));
            assert schedule != null;
            cache.put(key,schedule);
            log.info(String.format("【%s】创建定时任务成功",key));
        }
    }

2、测试

创建的线程类与工具已经封装完成,接下来我们来进行下测试。

先创建定时任务表:

SQL复制代码create table t_schedule_task(
    id int auto_increment primary key not null comment '主键Id',
    task_clazz varchar(200) not null comment '定时任务类',
    task_method varchar(200) not null comment '定时任务执行方法',
    cron varchar(200) not null comment '定时任务时间',
    status smallint not null default 0 comment '定时任务状态,0:开启,1:关闭'
) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8 comment '定时任务管理表';

2.1 创建定时任务执行类

java复制代码    /**
    * @author: jiangjs
    * @description:
    * @date: 2023/2/16 16:24
    **/
    @Slf4j
    @Component(value = "testSchedulingTask")
    public class TestSchedulingTask {
        public void taskMethod(UserInfo obj){
            log.info(String.format("调用了当前定时任务:输出参数:参数1:%s,参数2:%s",obj.getUserName(),obj.getPassword()));
        }
    }

简单获取用户信息,进行显示。

2.2 创建实现方法

java复制代码    /**
     * @author: jiangjs
     * @description:
     * @date: 2023/1/12 10:53
     **/
    @Service
    public class ScheduledTaskManageServiceImpl implements ScheduledTaskManageService {
        @Autowired
        private SchedulingTaskManage taskManage;
        @Resource
        private ScheduleTaskMapper scheduleTaskMapper;

        @Override
        public ResultUtil addTask(ScheduleTask task) {
            UserInfo userInfo = new UserInfo();
            userInfo.setUserName("张三");
            userInfo.setPassword("121212121212");
            String cron = task.getCron();
            boolean validExpression = CronExpression.isValidExpression(cron);
            if (!validExpression){
                return ResultUtil.error("无效的cron格式,请重新填写");
            }
            scheduleTaskMapper.insert(task);
            SchedulingTaskRunnable taskRunnable = new SchedulingTaskRunnable<>(userInfo, task.getTaskClazz(), task.getTaskMethod());
            taskManage.createSchedulingTask(String.valueOf(task.getId()), taskRunnable,task.getCron());
            return ResultUtil.success();
        }

        @Override
        public ResultUtil deleteTask(Integer id) {
            scheduleTaskMapper.deleteById(id);
            taskManage.stopSchedulingTask(String.valueOf(id));
            return ResultUtil.success();
        }

        @Override
        public ResultUtil editTask(ScheduleTask task) {
            scheduleTaskMapper.updateById(task);
            UserInfo userInfo = new UserInfo();
            userInfo.setUserName("张三");
            userInfo.setPassword("33333333");
            SchedulingTaskRunnable taskRunnable = new SchedulingTaskRunnable<>(userInfo, task.getTaskClazz(), task.getTaskMethod());
            taskManage.createSchedulingTask(String.valueOf(task.getId()), taskRunnable,task.getCron());
            return ResultUtil.success();
        }
    }

上述代码中ScheduleTaskMapper是继承Mybatis-plus中的BaseMapper实现单表操作,小伙伴们可自行实现。

2.3 执行结果

我们创建了三个方法,分别是: addTask,editTask,deleteTask来实现定时任务的删除,添加,具体实现参考上面代码。看看执行结果:

创建定时任务: 提交参数:

taskClazz:对应测试类 @Component(value = "testSchedulingTask")中的value值 taskMethod:测试内中的执行方法。如:TestSchedulingTask中的taskMethod方法 cron:定时任务的cron格式时间

从执行结果动态图可以看到,任务每隔5s种就会获取一次用户信息。

删除定时任务:

删除Id为1000的数据库任务,同时也是删除key为1000的定时任务

任务被删除后,即使过了5s依然没有任务在执行。


总结

ThreadPoolTaskScheduler实现定时任务主要是通过对线程的管理来进行操作,添加任务时即创建一个线程,删除时即将该线程删除。因此在创建定时任务只需要创建线程就可以,在创建线程时,通过反射来获取对应的方法及传递参数。

上述就是使用SprngBoot中的ThreadPoolTaskScheduler来实现定时任务,我们只要使用前端连接相应的接口就可以实现管理人员管理定时任务的功能。

今天就分享这么多,谢谢大家听我叨叨。

源码地址:github.com/lovejiashn/…

ThreadPoolTaskScheduler实现动态管理定时任务 最近,有个项目有需要用到定时任务,所以做了一个动态管理定时任务的模块。本文将从项目背景、需求、选型、思路、具体实现等方面展开介绍。 背景:有个支付类的项目,中间会产生一些中间态的订单,需要有个定时任务轮询确认订单状态。该类项目体量较小,单节点部署,客户比较多,需要简单快速的部署、维护。 需求:定时任务能够通过表达式灵活指定执行计划,并支持动态启动、关闭、修改。定时任务模块最好和业务包在一个jar包内,部署简单。 选型:说到定时任务,当下最... 阅读详情

相关推荐

SpringBoot动态定时任务实现:基于数据库配置与ThreadPoolTaskScheduler

定时任务是后端开发中实现周期性业务逻辑的核心技术,常用于数据同步、报表生成和缓存刷新等场景。其原理是通过调度器在特定时间点触发任务执行。传统的SpringBoot @Scheduled注解虽简单,但配置硬编码,缺乏灵活性。动态定时任务技术通过将任务配置(如Cron表达式、启停状态)外置到数据库,实现了运行时热更新,显著提升了系统的可维护性和可用性。这种模式特别适用于需求频繁变更的工程实践,例如需要根据运营策略动态调整执行频率的报表任务或数据清洗任务。本文以SpringBoot为基础,结合ThreadPool

weixin_30653023的博客 616

在 SpringBoot 中使用 ThreadPoolTaskScheduler 实现定时任务

在 SpringBoot 中使用 ThreadPoolTaskScheduler 来实现定时任务。

Wayfreem的博客 2万+

springboot不重启应用动态添加修改删除定时任务(以cron定时方式为例)

一、实现目标: 动态的添加修改删除cron定时任务,不需要重启应用,包括动态修改某个定时任务的cron定时时间以及任务内容的变化 二、实现思路: 1.设计存储任务信息的文件,此处采用json文件存储,认定task-xxx.json名称的文件为存储任务信息的文件,此处只做简单的日志打印 { "cron" : "0 17 15 * * ?", "taskInfo" : { ...

qq_37549757的博客 3511

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor是Spring框架中用于任务调度和线程池管理的类。ThreadPoolTaskScheduler主要用于任务调度,按照时间间隔或Cron表达式执行任务。ThreadPoolTaskExecutor主要用于线程池管理,执行异步任务和多线程任务。

qq_41067796的博客 3180

Springboot 通过ThreadPoolTaskScheduler实现定时任务.rar

1、通过ThreadPoolTaskScheduler、反射机制实现。 2、未开发前端界面,但是任务的添加、修改、启动、暂停、删除我已经写好,在TimmerController中

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

08_SpringBoot+ThreadPoolTaskScheduler,定时任务还可以这么玩

实现定时任务主要是通过对线程的管理来进行操作,添加任务时即创建一个线程,删除时即将该线程删除。因此在创建定时任务只需要创建线程就可以,在创建线程时,通过反射来获取对应的方法及传递参数。上述就是使用SprngBoot中的来实现定时任务,我们只要使用前端连接相应的接口就可以实现管理人员管理定时任务的功能。

成长需要沉淀。 1402

脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维

本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。

qq_32516809的博客 1417

定时任务还可以这么玩--基于SpringBoot中的ThreadPoolTaskScheduler实现动态定时任务

ThreadPoolTaskScheduler实现定时任务主要是通过对线程的管理来进行操作,添加任务时即创建一个线程,删除时即将该线程删除。因此在创建定时任务只需要创建线程就可以,在创建线程时,通过反射来获取对应的方法及传递参数。上述就是使用SprngBoot中的ThreadPoolTaskScheduler来实现定时任务,我们只要使用前端连接相应的接口就可以实现管理人员管理定时任务的功能。

jiashn123的专栏 1677

Versal ACAP NoC实战:像理解计算机网络一样配置AXI NoC,打通PS与PL数据通路

本文深入探讨了Versal ACAP NoC的配置与优化,通过计算机网络类比解析NoC架构,详细介绍了在VD100开发板上配置AXI NoC实现PS与PL数据交互的实战步骤。文章涵盖NoC组件功能、Vivado配置技巧、性能优化方法及常见问题解决方案,帮助开发者高效打通Versal芯片的数据通路。

weixin_42665255的博客 291

CollisionLoss 设计与实现原理说明

文章摘要 CollisionLoss是一种用于自动驾驶轨迹规划的碰撞惩罚损失函数,其核心思想是用多个沿车身纵轴排列的圆盘来近似表示车辆(Oriented Bounding Box)。该设计通过圆盘间的距离计算实现碰撞检测,具有以下特点: 可微性:圆盘距离计算处处可微,便于梯度回传,而传统矩形碰撞检测(分离轴定理)不可微且计算复杂。 多圆盘设计:沿车身纵向排列多个圆盘能更精确地拟合细长车体,避免单圆盘过度膨胀导致的误报。 安全覆盖:圆盘半径经过数学推导,确保完全覆盖车体矩形,避免漏检(宁可保守)。 软惩罚机制

@bangbang的博客 94

Springboot 通过ThreadPoolTaskScheduler实现定时任务动态增、删、改、启动、暂停

Springboot 通过Schedule实现定时任务动态增、删、改、启动、暂停 缺点:1、不支持分布式 2、本人未做界面开发,但是Controller层全部都已经定义好。 由于代码太多,值粘出部分代码,大家可以下载项目源码看看 数据库 CREATE TABLE `schedule_setting` ( `id` int(11) NOT NULL AUTO...

xcc_2269861428的博客 4188

【YOLO11改进 - C3k2融合】C3k2融合AKConv(可改变核卷积)二次创新:任意数量的参数和任意采样形状的即插即用的卷积

【YOLO11改进 - C3k2融合】C3k2融合AKConv(可改变核卷积)二次创新:任意数量的参数和任意采样形状的即插即用的卷积

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 407

SpringBoot实现用户定制的定时任务(动态定时任务)

我们知道SpringBoot能使用@Scheduled注解来进行定时任务的控制,该注解需要配合Cron表达式以及在启动类上添加@EnableScheduling注解才能使用。 不过我们现在的假定情景并不是程序员设定的定时任务,而是用户可以在我们的网页上定制定时任务,前端将该任务的信息发送到后端后,后端可以将此任务存入数据库并在规定的时间内执行。例如用户可以设定定时任务的执行时间段,执行时刻等,并可以随时新增、删除和改变定时任务。

qq_44709990的博客 7023

华为MetaERP月结加速方案:并行关账技术深度解析

【摘要】华为MetaERP并行关账技术通过创新架构设计,将传统串行月结流程(8-12小时)优化为并行执行(2-4小时)。关键技术包括:1)基于DAG引擎的任务依赖分析,实现模块/子任务三级并行;2)Saga模式分布式事务保障数据一致性;3)动态资源分配算法提升CPU利用率至60-80%。实施效果显示月结时间缩短70%,成功率提升至99.8%,错误恢复时间减少75%。该方案为大型企业ERP系统提供了高效的月结加速方案,未来还将结合AI调度与混合云扩展持续优化。

金牌架构师 1441

获取抖音中x-secsdk-csrf-token的方法

获取抖音中x-secsdk-csrf-token的方法

sh_moranliunian的博客 2020

SpringBoot+ThreadPoolTaskScheduler,定时任务还可以这么玩~

????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

weixin_44421461的博客 922

KEPServerEX物联网网关(IoT Gateway)REST客户端代理(非原创)

(中文版)资料来源于【OPC-KEPServerEX学习KEPWare交流】905485143群的【455196383】【零下一度】 一。KEPServerEX物联网网关REST客户端代理演示 在KSE中,首先构建一个带有通道/设备/标签的模拟器系统。 例如,下面是三个随机项目。 直接到IoT网关插件,添加新代理。 从类型列表中选择REST Client。 终结点...

-雲飛兄-博客 5807

SpringBoot定时任务别再用@Scheduled了!试试ThreadPoolTaskScheduler动态管理,附完整可运行Demo

本文深入探讨了SpringBoot中ThreadPoolTaskScheduler的动态定时任务管理,对比传统@Scheduled注解的局限性,详细解析了ThreadPoolTaskScheduler的核心机制与实现方法,并提供了完整的可运行Demo。通过动态调整cron表达式、运行时任务启停及线程池隔离等特性,显著提升了定时任务的灵活性与管理效率。

weixin_30635053的博客 304

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SpringBoot项目优雅关闭时,你的ThreadPoolTaskScheduler定时任务还在跑吗?避坑指南来了

本文深入探讨了SpringBoot优雅关闭时ThreadPoolTaskScheduler定时任务可能遇到的问题及解决方案。通过分析K8s滚动更新、服务下线等场景中的任务中断问题,提供了配置优化、自定义GracefulShutdownHandler和任务容错设计等生产级解决方案,帮助开发者确保定时任务在应用关闭时安全完成。

weixin_30915951的博客 435

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,算法与数据结构是必备不可少的。

2301_82242844的博客 1105

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

告别硬编码!用ThreadPoolTaskScheduler + 数据库动态管理SpringBoot定时任务(附完整CRUD接口)

本文详细介绍了如何利用ThreadPoolTaskScheduler和数据库动态管理SpringBoot定时任务,实现任务的CRUD操作。通过解耦配置与代码,开发者可以灵活调整任务调度策略,无需重新部署。文章还提供了核心组件实现、RESTful API设计及生产环境进阶技巧,帮助开发者构建高效、灵活的定时任务系统。

weixin_38168139的博客 248

SpringBoot定时任务别再用@Scheduled了!试试ThreadPoolTaskScheduler动态启停任务(附完整代码)

本文介绍了SpringBoot中如何使用ThreadPoolTaskScheduler实现动态定时任务管理,替代传统的@Scheduled注解。通过详细的核心机制解析和完整代码示例,帮助开发者灵活控制任务的启停、调整执行频率,并优化线程池配置,适用于营销活动、数据报表等需要动态调度的业务场景。

weixin_30924087的博客 281

Spring Boot 实现定时任务的动态增删启停等管理!

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草来源:jianshu.com/p/0f68936393fd推荐:http...

xmt1139057136的专栏 803

SpringBoot 实现静态、动态定时任务,本地动态定时任务调度

????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

weixin_44421461的博客 275
上一篇: Java操作Excel(Apache Poi详解)
下一篇: 深入理解JSP
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值