Spring 定时任务的注解实现方式

本文介绍 Spring 定时任务的实现方式。

注解 @Scheduled

该注解的参数分别表示的意思是:

  • cron 表达式:可以定制化执行任务。执行的方式与 fixedDelay 相近,会按照上一次方法结束时间开始算起。

  • fixedDelay:控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。

  • fixedRate:是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。

  • initialDelay 。如: @Scheduled(initialDelay = 10000,fixedRate = 15000)

    这个定时器就是在上一个的基础上加了一个 initialDelay = 10000 意思就是在容器启动后,延迟 10 秒后再执行定时器,以后每 15 秒再执行一次该定时器。

Spring 注解方式

启动:在 spring.xml 中进行驱动配置:

<!--启动定时任务的注解驱动-->
<task:annotation-driven/>

在方法上使用 @Scheduled 注解

@Component
public class Job2 {
    @Scheduled(fixedRate = 2000)
    public void run1(){
        // TODO
    }
}

Spring Boot 注解方式

  • 在启动类上加 @EnableScheduling 即可开启定时任务。
  • 做一个任务类,加一个 @Component 注解来被 Spring 管理。
  • 在方法上加 @Scheduled 注解

示例:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
@EnableScheduling
@Service("testService")
public class TestService {

    @Scheduled(fixedDelay = 5 * 60 * 1000)
    public void load() {
        // TODO
    }
}

Cron 表达式

Cron 表达式是一个字符串,字符串以 5 或 6 个空格隔开,分为 6 或 7 个域。

每一个域代表一个含义,Cron 有如下两种语法格式:

Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek

corn 从左到右 (用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

示例:

  • */2 * * * * ? 表示每 2 秒执行一次!
  • 0 0 2 1 * ? * 表示在每月的 1 日的凌晨 2 点调度任务
  • 0 15 10 ? * MON-FRI 表示周一到周五每天上午 10:15 执行作业
  • 0 15 10 ? 6L 2002-2006 表示 2002-2006 年的每个月的最后一个星期五上午 10:15 执行作业。

配置说明:

image-20220706104457206