likes
comments
collection
share

Spring Boot创建定时任务

作者站长头像
站长
· 阅读数 55

在项目开发中,可能会需要定期执行任务,比如发送消息通知,清理无用文件等,这时可以使用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 DemoApplication

fun 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
转载自:https://juejin.cn/post/7384140472338759690
评论
请登录