Springboot实现定时任务调度

news2025/1/13 7:41:31

前言

        今天给大家分享一下,如何使用springboot快速实现简单的定时调度任务?有两种方法:基于注解的声明式调度任务注册;另外一种是基于实现SchedulingConfigurer的编程式的调度任务注册。

1.  基于注解(@Scheduled)

        注解内有8个属性,分别是cron、fixedDelay、fixedDelayString、fixedRate、fixedRateString、initialDelay、initialDelayString、zone,使用方法很简单,分为两步:

  1. 使用@Configuration、@EnableScheduling,声明并开启调度任务类;
  2. 使用@Scheduled标记调度任务执行逻辑;
@Configuration
@EnableScheduling
public class StudentTask {
    @Scheduled(cron = "0/5 * * * * ?")
    private void configureTasks() {
        System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
    }
    @Scheduled(cron = "0/10 * * * * ?")
    private void configureTasks2() {
        System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
    }
}

1.1. cron表达式

        使用cron表达式来定义调度任务的执行规则,cron表达式是由若干数字、空格、符号按一定的规则,组成一组字符串,从而表达时间的信息。与正则表达式类似,都是一个字符串表示一些信息。

1.1.1 cron表达式的书写规则

        cron表达式的标准结构是一个字符串,以空格分隔为6或7个域,每个域代表一个含义,从左到右分别是:[秒] [分] [小时] [日] [月] [周]

第一个位置: 秒:区间 0-59 秒,代表一分钟内的秒数。

第二个位置:分:区间 0-59 分,代表一小时内的分钟数。

第三个位置:时:区间 0-23 时,代表一天中的小时数。

第四个位置: 日:区间 1-31 (?根据每月有多少天来),代表一月中的多少号。

第五个位置:月:区间 1-12 ,代表一年中的月份。

第六个位置:周:区间 1-7或者英文星期的缩写,代表星期几。

每个域允许使用特殊字符组成一些通配符表示不同的调度规则,可以使用的特殊字符如下:

“0-9”:数值,出现在标识符位置的数字代表对应值,比如出现在第一个位置就表示秒;

“*”:所有可能的值,如在秒域上出现,表示每一秒;在分域上出现,表示每一分; “?” :忽略,不指定具体的值,只有在日域、周域上可以使用;

“/” :间隔,指定数值的增量,语义相当于每隔… 比如例2中的第三个位置的2/5就表示从2点开始每隔五小时

“-”:区间,如分钟域中,5-20 表示从5分钟到20分钟之间每隔一分钟触发一次

“,”:列出枚举值,如在分钟域中,5,20表示分别在5分钟和20分钟触发一次

“L”:表示最后一天,仅日期和星期域支持该字符,在日期域中,L表示某个月的最后一天。在星期域中L表示一个星期的最后一天,也就是星期日(SUN)。如果在L前有具体的内容,例如,在星期域中的6L表示这个月的最后一个星期六。

“W ”:除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件。W字符寻找最近有效工作日时不会跨过当前月份,连用字符LW时表示为指定月份的最后一个工作日,在日期域中5W,如果5日是星期六,则将在最近的工作日星期五,即4日触发。如果5日是星期天,则将在最近的工作日星期一,即6日触发;如果5日在星期一到星期五中的一天,则就在5日触发。

“#”:周定位,仅周域支持该字符,语义相当于每月的第几个周几 比如例4中的第六个位置的2#3就表示第三个周一。

1.1.2 cron表达式举例

0 15 10 ? * *

每天上午10:15执行任务

0 15 10 * * ?

每天上午10:15执行任务

0 0 12 * * ?

每天中午12:00执行任务

0 0 10,14,16 * * ?

每天上午10:00点、下午14:00以及下午16:00执行任务

0 0/30 9-17 * * ?

每天上午09:00到下午17:00时间段内每隔半小时执行任务

0 * 14 * * ?

每天下午14:00到下午14:59时间段内每隔1分钟执行任务

0 0-5 14 * * ?

每天下午14:00到下午14:05时间段内每隔1分钟执行任务

0 0/5 14 * * ?

每天下午14:00到下午14:55时间段内每隔5分钟执行任务

0 0/5 14,18 * * ?

每天下午14:00到下午14:55、下午18:00到下午18:55时间段内每隔5分钟执行任务

0 0 12 ? * WED

每个星期三中午12:00执行任务

1.2 fixedDelay

        从上次调用结束到下一次调用之间的固定时间(以毫秒为单位),比如fixedDelay=5000,表示当调度任务被触发并且调度任务执行完成后,延迟5秒,调度任务再次被触发;但是需要注意的是fixedDelay、cron、fixedRate不能同时使用。

1.3 fixedDelayString

        与fixedDelay的含义和使用基本相同,唯一区别fixedDelayString使用字符串的形式,支持占位符。

1.4fixedRate

        fixedRate 两次调用之间固定的毫秒数,比如fixedRate=5000,表示当调度任务第一次执行被触发后,后续不管上一次的任务是否完成,都会在上一次触发后5秒钟再次触发调度任务。

1.5 fixedRateString

        与 fixedRate的含义和使用基本相同,唯一区别是fixedRateString使用字符串的形式,支持占位符。

1.6 initialDelay

        第一次执行 fixedRate 或者 fixedDelay 任务之前要延迟的毫秒数,比如initialDelay=5000,表示 fixedRate 或者 fixedDelay的调度任务第一次执行时会延迟5秒,需要注意的是使用cron表达时,不能使用initialDelay属性。

1.7 zone

        时区,默认是一个空字符串,即取服务器所在地的进区,cron表达式会基于该时区进行解析;

2. 基于实现SchedulingConfigurer接口

  1. 主要通过实现org.springframework.scheduling.annotation.SchedulingConfigurer接口,重写configureTasks()方法实现调度任务的注册;
  2. 实现java.lang.Runnable接口,在run方法中编写调度任务的执行逻辑;
  3. 使用org.springframework.scheduling.support.CronTrigger声明一个cron表达式类型的触发器
  4. 使用上两步的实例对象作为触发器任务的构造参数实例化一个org.springframework.scheduling.config.TriggerTask对象;
  5. 重写configureTasks()方法时,使用调度任务注册器scheduledTaskRegistrar(org.springframework.scheduling.config.ScheduledTaskRegistrar)注册触发器任务(TriggerTask)
@Configuration
public class DynamicScheduleTask implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        List<TriggerTask> list = new ArrayList<>();
        BeginClassTask beginClassTask = new BeginClassTask();
        TriggerTask triggerTask = new TriggerTask(beginClassTask, new CronTrigger("0/5 * * * * ?"));
        list.add(triggerTask);
        EndClassTask endClassTask = new EndClassTask();
        TriggerTask triggerTask1 = new TriggerTask(endClassTask, new CronTrigger("0/10 * * * * ?"));
        list.add(triggerTask1);
        //将任务列表注册到定时器
        scheduledTaskRegistrar.setTriggerTasksList(list);
    }
}

3. 总结

        基于注解形式的调度任务注册比较简单,但是不灵活,没有办法在程序运行状态时动态对已注册的调度任务进行添加和删除;

        基于实现基于实现SchedulingConfigurer接口的形式,因为是通过编程式实现调度任务的注册,所以可以通过这种方式实现在程序运行状态时动态对已注册的调度任务进行添加和删除,但是缺点也比较 明显,实现的过程比较繁琐,不如使用注解那般灵活。

        最后要说一点,对于一般性的调度任务执行场景,使用上面两种方法中的一种都是没有问题的。但是如果涉及大量的、并发比较高、执行精度比较高、分布式部署的场景,其实是不太适用的,可以选择其他更优的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Problem Set 2

Regularized Normal Equation for Linear Re-gression Given a data set {ar(), y()}i1,.-.,m with x()∈ R" and g(∈ R, the generalform of regularized linear regression is as follows n (he(zr)- g)3入>0号 (1) ” 2m i1 j1 Derive the normal equation. 设 X[(…

P7 PyTorch 属性统计

目录 Norm min max argmax argmin prod sum dim keepdim topk & kthvalue eq&equal一 Norm 作用&#xff1a; 求范数 1.1 1阶范数 # -*- coding: utf-8 -*- """ Created on Thu Dec 22 21:48:02 2022author: cxf """ import torc…

前端_Vue_8.生命周期钩子、侦听器

文章目录一、生命周期钩子1.1. 注册生命周期钩子1.2. 生命周期图示二、侦听器2.1. 基本示例2.2. 深层侦听器2.3. 即时回调的侦听器2.4. 回调的触发时机2.5. this.$watch()2.6. 停止侦听器一、生命周期钩子 每个Vue组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比…

重要升级:SpreadJS 16.0 crack SpreadJS 2023

SpreadJS 16.0 crack&#xff0c;建议大家赶紧升级&#xff0c;速度提升65% Adds enhancements for TableSheet, Designer, Calculation, Shape and Workbook. December 22, 2022 - 16:53New Version Features New File Format New .sjs file format makes the ExcelIO process…

Java语法:final关键字

一、final是什么&#xff1f; final关键字是最终的意思&#xff0c;可以修饰&#xff08;类、方法、变量&#xff09;。 二、final的作用 修饰类&#xff1a;表明该类是最终类&#xff0c;不能被继承&#xff1b; 报错说明&#xff1a;不发从最终的Animal类继承 修饰方法&…

数论专题(2)莫比乌斯反演

今天我们开始莫比乌斯反演的学习.这篇博文特别多的公式,强迫症患者请勿观看 莫比乌斯反演 莫比乌斯函数: 定义莫比乌斯函数,当时,. 当是square-free number时,设的质因数分解有项,则; 否则,; 根据上面,我们不难验证也是积性函数 定理 ,即和互为彼此的逆 证明 设n的不…

4.防止数据权限越权

涉及的修改 这次提交内容很简单&#xff0c;就是在这些类的操作上&#xff0c;添加了 checkXxxDataScope()方法校验&#xff0c;下面来看下这个方法的实现 /*** 校验用户是否有数据权限* * param userId 用户id*/ Override public void checkUserDataScope(Long userId) {if (…

RMQ延迟队列

目录一、场景二、TTL和DLX三、开发步骤一、场景 “订单下单成功后&#xff0c;15分钟未支付自动取消” 1.传统处理超时订单 采取定时任务轮训数据库订单&#xff0c;并且批量处理。其弊端也是显而易见的&#xff1b;对服务器、数据库性会有很大的要求&#xff0c; 并且当处理大…

jeecg-boot前端实现表格插槽、定制化修改

大家好&#xff0c;我是雄雄。 前言 关于jeecg-boot&#xff0c;之前介绍过好多好多次&#xff0c;至于说这是个什么样的技术&#xff0c;这里不在详细介绍&#xff0c;大家可以在gitee或者百度上搜搜&#xff0c;大致了解一下。 因为是个开源的框架&#xff0c;所以一般小项目…

Unity 3D 创建简单的几何模型 || Unity 3D Assets 游戏资源目录管理

Unity 3D 创建简单的几何模型 Unity 3D 是一个强大的游戏开发引擎。在游戏开发中使用的模型常常是从外部导入的&#xff0c;Unity 3D 为了方便游戏开发者快速创建模型&#xff0c;提供了一些简单的几何模型&#xff0c;其中包括立方体、球体、圆柱体、胶囊体等。 自由物体创建…

单测在商家前端业务中的实践

1. 背景 商家系统是提供给得物商家在得物平台上可以稳定运营的服务抓手&#xff0c;前端代码也伴随着系统的发展而不断壮大。这样将导致文档却更新不及时&#xff0c;最后想再通过这些文档回溯业务逻辑也非常困难。 且若代码结构上没有关注&#xff0c;动辄就会产出一个大几千…

LFU 的设计与实现

LFU 的设计与实现 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;LFU 的设计与实现 CSDN&#xff1a;LFU 的设计与实现 题目描述 LFU&#xff08;least frequently used&#xff09;。即最不经常使用页置换算法。 题目链接&#xff1a;LeetCode 460. LF…

浅析Linux字符设备驱动程序内核机制

前段时间在学习linux设备驱动的时候&#xff0c;看了陈学松著的《深入Linux设备驱动程序内核机制》一书。说实话&#xff0c;这是一本很好的书&#xff0c;作者不但给出了在设备驱动程序开发过程中的所需要的知识点&#xff08;如相应的函数和数据结构&#xff09;&#xff0c;…

从零开始的MySQL(2)

目录1.数据库约束1.1 unique1.2 not null1.3 default1.5 primary key1.6 foreign key2. 将A的记录插入到B中3.聚合函数3.1 count()函数3.2 sum()函数3.3 avg()函数3.4 max()函数3.5 MIN()函数3.6 group by4.联合查询4.1 内连接4.2 外连接4.3 自连接4.4 子连接1.数据库约束 约束…

【简单易上手】昇思MindSpore邀你定制专属Diffusion模型

昇思MindSpore首个可训练diffusion模型DDPM马上要和大家见面了&#xff0c;操作简单&#xff0c;可训练推理&#xff0c;单卡即可运行&#xff0c;欢迎广大产学研开发者使用启智社区免费Ascend NPU算力体验 最近爆火的AI绘图&#xff0c;相信大家并不陌生了。 从AI绘图软件生成…

知识图谱的知识表示:向量表示方法

目录 从词向量到实体向量 知识图谱向量表示学习模型 TransE TransH TransR TransD TransX系列总结 DisMult 从词向量到实体向量 知识图谱的向量表示。有一类词是代表实体的&#xff0c;假如对这类实体词的向量做一些计算&#xff0c;比如用Rome向量减去Italy的向量&am…

使用界面组件Telerik ThemeBuilder研发主题,只需要这七步!

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供最完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序。 ThemeBuilder是一个web应用程序&#xff0…

前端基础(一)_初识JavaScript

最开始的时候&#xff0c;浏览器只能显示文本和图片&#xff0c;并不能做各种动态的操作。 一、JavaScript的历史 1、网景公司的布兰登艾奇开发了js 2、借鉴了java的数据管理机制、c的函数 3、Js的创建是用来解决浏览器和用户之间互动的问题&#xff08;表单提交的问题&#…

LeanCloud 快速实现服务端

1. 实现与服务器交互平台 1.1 Google 平台的 Firebase (需要科学网络) Firebasehttps://firebase.google.cn/ 1.2 LeanCloud 平台 LeanCloudhttps://www.leancloud.cn/ 2. 配置信息 2.1 在 LeanCloud 控制台创建应用, 根据 SDK下载 开发指南配置应用 2.2 配置文件 build…

拉伯杠杆平台|新冠药龙头跳水,万亿产业开启新阶段!

依照此前发表的时间表&#xff0c;新修订的《体育法》将于2023年1月1日起正式施行。 12月27日早盘&#xff0c;A股前期大热的抗疫体裁呈现显着回落。熊去氧胆酸、新冠药、肝炎概念、新冠检测、生物疫苗等体裁跌幅较大。熊去氧胆酸、新冠药两大板块跌幅超过4%&#xff0c;抢手龙…