Spring Boot创建定时任务

ops/2024/9/24 7:24:32/

在项目开发中,可能会需要定期执行任务,比如发送消息通知,清理无用文件等,这时可以使用Spring Boot的定时任务功能。

安装依赖

定时任务功能包含在Spring Boot中,因此引入Spring Boot Starter Web即可安装相关依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.1</version>
</dependency>
implementation("org.springframework.boot:spring-boot-starter-web:3.3.1")
implementation 'org.springframework.boot:spring-boot-starter-web:3.3.1'

相关依赖的版本号可以参考Maven Repository。

创建定时任务

启动定时任务功能

EnableScheduling注解放在任意一个标记有Configuration注解的类上面即可启动定时任务功能。一般来说可以把这个注解放在应用的启动类上面,能够让Spring自动扫描项目中的定时任务。

@EnableScheduling
@SpringBootApplication
public class DemoApplication{public static void mian(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
@EnableScheduling
@SpringBootApplication
class DemoApplicationfun main(args: Array<String>) {runApplication<DemoApplication>(args) {}
}

创建定时任务

@Component
public class DemoTask {@Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS)public void scheduledTask() {System.out.println("Scheduled task executed.");}
}
@Component
class DemoTast {@Scheduled(fixedRage = 5, timeUnit = TimeUnit.SECONDS)fun scheduledTask() {println("Scheduled task executed.")}
}

上面的代码配置了一个定时任务。在项目启动后,这个定时任务会每5秒钟在控制台打印一次消息。

Scheduled注解

Spring Boot提供了多种方式实现定时任务,包括Cron表达式,按照固定的频率等。

Cron表达式

使用cron参数来配置定时任务的执行周期。Spring Boot的Cron表达式语法扩展了UNIX的Cron表达式语法,格式包括:秒、分钟、小时、日、月、周,格式如下:

 ┌───────────── second (0-59)│ ┌───────────── minute (0 - 59)│ │ ┌───────────── hour (0 - 23)│ │ │ ┌───────────── day of the month (1 - 31)│ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)│ │ │ │ │ ┌───────────── day of the week (0 - 7)│ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)│ │ │ │ │ │* * * * * *

Cron表达式的规则如下:

  1. 使用*表示从头到尾,对于日期(day of month)或者星期几字段,可以使用?来代替。
  2. 使用,来分隔列表中的多个元素。
  3. 使用-连接起来的数字表示时间范围,包括两端的数字。
  4. 对于范围或者是*,后面可以添加/表示数字的间隔(步长)。
  5. 对于月份或者星期几,可以使用英文的前三个字母代替,不区分大小写,比如JAN或者FRI
  6. 日期或者星期几字段后面可以加上L,其含义不同:
    1. 对于日期,L表示当月最后一天;或者是L-n表示从当月第n天开始,一直到最后一天,比如L-3表示从当月第三天起,一直到当月最后一天。
    2. 对于星期,L表示星期的最后一天,如果前面加上某个星期,则表示当月最后一个星期几,比如FRIL表示当月最后一个周五。
  7. 使用W表示最近的一个工作日(周一到周五),12W表示当月12号最近的一个工作日,如果当天是周六,那么结果就是周五;如果是周日,那么结果就是周一;对于1W,表示当月的第一个工作日,不考虑上个月的情况。
  8. 日期字段如果是LW,表示当月最后一个工作日。
  9. 星期字段加上#n,表示当月第n个星期几,例如FRI#2表示当月第二个星期五。
    常见的例子如下:
  • 0 0 * * * *:每小时执行一次。
  • */10 * * * * *:每10秒执行一次。
  • 0 0 8-10 * * *:每天08:00、09:00、10:00各执行一次。
  • 0 0 8,10 * * *:每天08:00、10:00执行一次。
  • 0 0/30 8,9 * * *:每天08:00、08:30、09:00、09:30各执行一次。
  • 0 0 0 25 DEC ?:每年圣诞节执行一次。
  • 0 0 0 L-3 * *:每月第三天到最后一天,每天执行一次。
  • 0 0 0 ? * MON#1:每个月第一个周一执行一次。
    对于一些常用的时间,Spring Boot提供了一些宏来提高可读性:
  • @yearly@annually:每年执行一次,等价于0 0 0 1 1 *
  • @monthly:每月执行一次,等价于0 0 0 1 * *
  • @weekly:每周执行一次,等价于0 0 0 * * 0
  • @daily@midnight:每天执行一次,等价于0 0 0 * * *
  • @hourly:每小时执行一次,等价于0 0 * * * *

使用时间间隔

指定fixedDelay或者fixedRate参数设置执行的频率,参数都是long类型。其中fixedDelay表示距离上次调用结束之后的等待时间,fixedRate参数表示固定的间隔,不管上一次执行消耗了多少时间。
除了指定两次定时任务的时间间隔,还可以通过initialDelay表示从项目运行到第一次执行的时间间隔,下面的代码表示第一次执行需要等待10秒,之后以每5秒一次的固定频率执行。

@Scheduled(initialDelay = 10, fixedRate = 5, timeUnit = TimtUnit.SECONDS)

可以使用fixedDelayStringfixedRateString或者initialDelayString传递字符串格式的参数,这个用法不常用,参数值可以参考java.time.Duration,比如P2D表示每两天执行一次。

指定时间单位和时区

如果不指定的话,默认的时间单位是毫秒,即TimtUnit.MILLISECONDS,在时间间隔比较长的情况下写起来会比较困难,因此可以通过timeUnit参数指定时间间隔,取值如下:

  • NANOSECONDS:纳秒
  • MICROSECONDS:微妙
  • MILLISECONDS:毫秒
  • SECONDS:秒
  • MINUTES:分钟
  • HOURS:小时
  • DAYS:天
    对于国际化的应用,有时需要使用其他地区的时区信息,可以使用zone参数指定时区,如果不指定,那么使用服务器的时区信息,格式可以是CSTAsia/Shanghai或者GMT+08:00

http://www.ppmy.cn/ops/54898.html

相关文章

享元模式

享元模式 享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享尽可能多的相似对象来最小化内存使用,从而提高系统的性能。这种模式通常用于处理大量细粒度对象的情况,例如在文本编辑器、图形编辑器和游戏开发中。 享元模式的原理 享元模式的核心思想是区分内部…

vue 中使用element-ui实现锚点定位表单

效果图&#xff1a; 代码&#xff1a; html代码&#xff1a; <div class"content-left"><el-tabs :tab-position"left" tab-click"goAnchor"><el-tab-pane v-for"(item,index) in anchorNameList"v-anchor-scroll:ke…

Symfony国际化与本地化:打造多语言应用的秘诀

标题&#xff1a;Symfony国际化与本地化&#xff1a;打造多语言应用的秘诀 摘要 Symfony是一个高度灵活的PHP框架&#xff0c;用于创建Web应用程序。它提供了强大的国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;功能&#xff0c;允许开发者轻松创…

编译原理2

推导和短语 推导 推导过程中&#xff0c;每一步推导都是对句型的 最右非终结符 进行替换&#xff0c;最右推导(规范推导)&#xff1b; 短语 用 β 替换 A&#xff0c;则 β 就是 关于A 的一个短语&#xff1b; 直接短语是短语范围内的一步推导&#xff1b; 直接短语可能不…

snowflake 不再是个数据仓库公司了

标题先上结论&#xff0c;为啥这么认为&#xff0c;且听接下来道来。 snowflake 非常成功&#xff0c;开创了云数仓先河&#xff0c;至今在数仓架构上也是相对比较先进的&#xff0c;国内一堆模仿的公司&#xff0c;传统上我们会认为 snowflake 肯定是一家数据仓库公司。不过最…

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区&#xff0c;是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州&#xff0c;北接密歇根州…

走进IT的世界

引言 随着高考的结束&#xff0c;对于即将踏入IT&#xff08;信息技术&#xff09;领域的新生而言&#xff0c;这个假期不仅是放松身心的时间&#xff0c;更是提前规划、深化专业知识、为大学生活奠定坚实基础的宝贵机会。以下是一份详尽的高考假期预习与规划指南&#xff0c;…

《mysql篇》--查询(进阶)

目录 将查询结果作为插入数据 聚合查询 聚合函数 count sum group by子句 having 联合查询 笛卡尔积 多表查询 join..on实现多表查询 内连接 外连接 自连接 子查询 合并查询 将查询结果作为插入数据 Insert into 表2 select * from 表1//将表1的查询数据插入…