news 2026/4/23 14:24:59

8.SpringTask

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.SpringTask
8.1 定时任务

定时任务即系统在特定时间执行一段代码,它的场景应用非常广泛:

购买游戏的月卡会员后,系统每天给会员发放游戏资源。

管理系统定时生成报表。

定时清理系统垃圾。

定时任务的实现主要有以下几种方式:

  1. Java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务。使用这种方式可以让程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
  2. Quartz。这是一个功能比较强大的的调度器,可以让程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
  3. Spring3.0以后自带Spring Task,可以将它看成一个轻量级的Quartz,使用起来比Quartz简单许多,在课程中我们使用Spring Task实现定时任务
8.2 SpringTask_Cron表达式

SpringTask依靠Cron表达式配置定时规则。Cron表达式是一个字符串,分成六个或七个域,有以下两种语法格式:

1.Seconds Minutes Hours DayofMonth Month DayofWeek Year

2.Seconds Minutes Hours DayofMonth Month DayofWeek

Seconds(秒):域中可出现,-*/四个字符,以及0-59的整数

*:表示匹配该域的任意值,在Seconds域使用*,表示每秒钟都会触发

,:表示列出枚举值。在Seconds域使用5,20,表示在5秒和20秒各触发一次。

-:表示范围。在Seconds域使用5-20,表示从5秒到20秒每秒触发一次

/:表示起始时间开始触发,然后每隔固定时间触发一次。在Seconds域使用5/20, 表示5秒触发一次,25秒,45秒分别触发一次。

Minutes(分):域中可出现,-*/四个字符,以及0-59的整数

Hours(时):域中可出现,-*/四个字符,以及0-23的整数

DayofMonth(日期):域中可出现,-*/?LWC八个字符,以及1-31的整数

C:表示和当前日期相关联。在DayofMonth域使用5C,表示在5日后的那一天触发,且每月的那天都会触发。比如当前是10号,那么每月15号都会触发。

L:表示最后,在DayofMonth域使用L,表示每个月的最后一天触发

W:表示工作日,在DayofMonth域用15W,表示最接近这个月第15天的工作日触发,如果15号是周六,则在14号即周五触发;如果15号是周日,则在16号即周一触发;如果15号是周二则在当天触发。

  • 注:

    1. 该用法只会在当前月计算,不会到下月触发。比如在DayofMonth域用31W,31号是周日,那么会在29号触发而不是下月1号。
    2. 在DayofMonth域用LW,表示这个月的最后一个工作日触发。

Month(月份):域中可出现,-*/四个字符,以及1-12的整数或JAN-DEC的单词缩写

DayofWeek(星期):可出现,-*/?L#C八个字符,以及1-7的整数或SUN-SAT 单词缩写,1代表星期天,7代表星期六

C:在DayofWeek域使用2C,表示在2天后的那一天触发,且每周的那天都会触发。比如当前是周一,那么每周三都会触发。

L:在DayofWeek域使用L,表示在一周的最后一天即星期六触发。在DayofWeek域使用5L,表示在一个月的最后一个星期四触发。

#:用来指定具体的周数,#前面代表星期几,#后面代表一个月的第几周,比如5#3表示一个月第三周的星期四。

?:在无法确定是具体哪一天时使用,用于DayofMonth和DayofWeek域。一般定义了其中一个域,另一个域是不确定的,比如每月20日触发,无法确定20日是星期几,写法如下:0 0 0 20 * ?;或者在每周一触发,此时无法确定该日期是几号,写法如下:0 0 0 ? * 2

Year(年份):域中可出现,-*/四个字符,以及1970~2099的整数。该域可以省略,表示每年都触发。

8.3 注解实现

1.在配置类上添加@EnableScheduling注解

2.在方法上方添加@Scheduled,指定该方法定时执行

// 定时任务类 @Component public class MySpringTask2 { // 打印时间 @Scheduled(cron = "* * * * * *") public void printTime(){ SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); String now = sdf.format(new Date()); System.out.println(now+"定时任务2"); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 0:10:15

Java 的节奏哲学:一门不追求“最快”,却极少“失控”的工程语言

在技术讨论中,“快”常常被当作最高追求: 启动要快、响应要快、开发要快、迭代要快。 但在真实工程世界里,很多系统并不是因为“慢”而失败,而是因为节奏失控。节奏失控意味着:负载变化无法预期性能波动难以解释系统状…

作者头像 李华
网站建设 2026/4/17 10:03:48

收藏!大模型项目别瞎做,这样做才拿得到Offer

在CSDN的大模型交流区和我的学习社群里,每天都能刷到类似的困惑:有人晒出自己搭建的第8个RAG系统Demo,简历里却写得像“流水账”;有人把LoRA微调、模型量化玩得炉火纯青,面试时被问“这个技术能帮公司省多少钱”却哑口…

作者头像 李华
网站建设 2026/4/23 11:39:00

Go语言中的切片

Go 语言中的切片(Slice)是一个非常核心的数据结构,它是对数组的抽象和封装,提供了更灵活、强大的序列处理能力。一. 切片的基本概念切片是一个动态数组,它由三个部分组成:指针:指向底层数组的起…

作者头像 李华
网站建设 2026/4/19 4:24:06

粒子数据结构示例

[1]计及网架重构分布式电源容量配置程序 粒子群算法 粒子群算法对配电网分布式电源容量配置 以IEEE33节点为例 以节点电压偏差最小,有功网损最小为优化目标,计及配电网网架重构,优化DG容量和开断支路 包含【参考文献,详细说明】电…

作者头像 李华
网站建设 2026/4/16 17:16:17

APOVMD自适应变分模态分解 通过变分模态分解模态分解的中心频率比值自适应的选择模态数和惩罚因子

APOVMD自适应变分模态分解 通过变分模态分解模态分解的中心频率比值自适应的选择模态数和惩罚因子,避免手动选参造成的过度分解或信息丢失问题 matlab代码,注释清楚;含参考文献 数据为excel数据,使用时替换数据集即可;…

作者头像 李华