SpringBoot整合定时任务

Spring Boot整合定时任务

核心结论:Spring Boot 定时任务是基于 Spring Task 实现的、按指定时间规则自动执行任务的功能,需通过 @EnableScheduling 开启支持、@Scheduled 定义执行规则,适用于周期性业务场景,实现简单且无需额外复杂配置。

一、定时任务是什么?

定时任务是指按照预设的时间规则(如固定间隔、指定时间点、特定周期)自动执行的程序逻辑。

在 Spring Boot 中,定时任务基于 Spring 框架的 Spring Task 组件实现,支持注解式配置,无需整合第三方框架(如 Quartz)即可快速实现,核心是通过注解指定任务执行规则,由 Spring 容器自动调度执行。

二、为什么需要定时任务?

  • 解决周期性业务需求:无需人工干预,自动完成重复操作,比如每天凌晨备份数据、每月初生成报表。
  • 提升系统自动化水平:减少手动操作成本,避免人为失误,比如定时清理系统缓存、自动发送定时通知。
  • 适配业务时间规则:满足特定时间点的业务触发,比如工作日早 9 点发送考勤提醒、每周日晚同步数据。

三、案例实践

image-20251029174440932

1. 环境准备

构建Maven项目,项目名为SpringBootSchedule-Demo,修改pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!-- SpringBoot父依赖 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.4</version>
    <relativePath/>
  </parent>
  <groupId>com.yqd</groupId>
  <artifactId>SpringBootSchedule-Demo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SpringBootSchedule-Demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- Spring Web:提供 HTTP 测试接口 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

2. 核心步骤

步骤 1:开启定时任务支持

在项目启动类上添加 @EnableScheduling 注解,开启基于注解的定时任务调度支持。

package com.yqd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling // 开启定时任务支持
public class TimerTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TimerTaskApplication.class, args);
    }
}

步骤 2:编写定时任务业务类

com.yqd.service 包下创建定时任务处理类,通过 @Scheduled 注解定义具体任务及执行规则。

package com.yqd.service;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service // 注入 Spring 容器
public class ScheduledTaskService {
    // 格式化时间输出
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 示例 1:固定间隔执行(上一次任务结束后,间隔 3 秒执行下一次)
     */
    @Scheduled(fixedDelay = 3000)
    public void fixedDelayTask() {
        System.out.println("固定间隔任务执行,当前时间:" + sdf.format(new Date()));
    }

    /**
     * 示例 2:固定频率执行(每隔 5 秒执行一次,无论上一次是否结束)
     */
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("固定频率任务执行,当前时间:" + sdf.format(new Date()));
    }

    /**
     * 示例 3:Cron 表达式执行(每天 10:30:00 执行)
     * Cron 格式:秒 分 时 日 月 周
     */
    @Scheduled(cron = "0 30 10 * * ?")
    public void cronTask() {
        System.out.println("Cron 定时任务执行,当前时间:" + sdf.format(new Date()));
    }

    /**
     * 示例 4:延迟初始化执行(项目启动后延迟 10 秒,再每隔 6 秒执行一次)
     */
    @Scheduled(initialDelay = 10000, fixedRate = 6000)
    public void initialDelayTask() {
        System.out.println("延迟初始化任务执行,当前时间:" + sdf.format(new Date()));
    }
}

步骤 3:核心注解与参数说明

(1)@EnableScheduling
  • 作用:开启 Spring 定时任务调度支持。
  • 位置:仅需在项目启动类上添加一次。
(2)@Scheduled 核心属性
属性 说明 示例
fixedDelay 上一次任务结束后,间隔指定毫秒数执行下一次(long 类型) fixedDelay = 3000(间隔 3 秒)
fixedRate 每隔指定毫秒数执行一次,忽略上一次任务执行时长(long 类型) fixedRate = 5000(每隔 5 秒)
fixedDelayString 与 fixedDelay 功能一致,参数为字符串类型(支持占位符) fixedDelayString = "3000"
fixedRateString 与 fixedRate 功能一致,参数为字符串类型(支持占位符) fixedRateString = "5000"
initialDelay 项目启动后,延迟指定毫秒数执行第一次任务(需配合 fixedRate/fixedDelay) initialDelay = 10000(延迟 10 秒)
cron 自定义执行时间规则(最灵活),格式:秒 分 时 日 月 周 0 30 10 * * ?(每天 10:30)
(3)Cron 表达式常用规则
通配符 说明 示例
* 匹配该域所有值 * * * * * ?(每秒执行一次)
? 不指定值(仅用于日、周) 0 0 12 * * ?(每天 12 点执行)
, 枚举多个值 0 0 9,18 * * ?(每天 9 点、18 点执行)
- 指定区间 0 0 9-12 * * ?(每天 9-12 点整点执行)
/ 指定步长 0 */10 * * * ?(每隔 10 分钟执行一次)
L 表示 “最后”(用于日、周) 0 0 * L * ?(每月最后一天整点执行)

3. 测试效果

启动 Spring Boot 项目,控制台会输出各定时任务的执行日志,示例如下:

固定间隔任务执行,当前时间:2025-10-29 17:43:24
固定频率任务执行,当前时间:2025-10-29 17:43:26
固定间隔任务执行,当前时间:2025-10-29 17:43:27
固定间隔任务执行,当前时间:2025-10-29 17:43:30
延迟初始化任务执行,当前时间:2025-10-29 17:43:31
固定频率任务执行,当前时间:2025-10-29 17:43:31
固定间隔任务执行,当前时间:2025-10-29 17:43:33
固定频率任务执行,当前时间:2025-10-29 17:43:36
固定间隔任务执行,当前时间:2025-10-29 17:43:36
延迟初始化任务执行,当前时间:2025-10-29 17:43:37
固定间隔任务执行,当前时间:2025-10-29 17:43:39
固定频率任务执行,当前时间:2025-10-29 17:43:41
固定间隔任务执行,当前时间:2025-10-29 17:43:42
延迟初始化任务执行,当前时间:2025-10-29 17:43:43
固定间隔任务执行,当前时间:2025-10-29 17:43:45
固定频率任务执行,当前时间:2025-10-29 17:43:46

四、注意事项

  • 定时任务默认是单线程执行,若任务执行时间过长,会导致后续任务阻塞,可通过配置线程池优化。
  • Cron 表达式中 “日” 和 “周” 不能同时指定具体值,需用 ? 忽略其中一个(避免冲突)。
  • 若需动态调整定时任务(如修改执行频率),Spring Task 原生不支持,可考虑整合 Quartz 框架。
posted @ 2025-10-29 21:51  碧水云天4  阅读(4)  评论(0)    收藏  举报