Spring中的定时任务怎么用?

一、定时任务怎么用?

1️⃣ 开启定时任务

java 复制代码
@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2️⃣ 编写定时任务

java 复制代码
@Component
public class OrderTask {

    // 每 5 秒执行一次
    @Scheduled(fixedRate = 5000)
    public void checkOrderStatus() {
        System.out.println("检查订单状态...");
    }
}

3️⃣ 常见调度方式

java 复制代码
// 固定间隔(上一次开始 → 下一次开始)
@Scheduled(fixedRate = 5000)

// 固定延迟(上一次结束 → 下一次开始)
@Scheduled(fixedDelay = 5000)

// Cron 表达式(最灵活)
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨 2 点

4️⃣ Cron 表达式速记

java 复制代码
秒 分 时 日 月 周
0  0  2  *  *  ?
  • * 任意

  • ? 不指定

  • 0/5 每 5 秒

  • MON-FRI 周一到周五

📌 适合场景

库存检查、数据同步、日志清理、缓存预热


二、线程池

默认的 @Scheduled 是单线程的,任务一堵,后面的都排队 🐌。

1️⃣ 自定义线程池

java 复制代码
@Configuration
@EnableScheduling
public class ScheduleConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5);
        scheduler.setThreadNamePrefix("schedule-");
        scheduler.initialize();
        return scheduler;
    }
}

2️⃣ 好处

  • 多任务并行执行

  • 不怕某个任务"赖着不走"


四、分布式定时任务:防止"多实例同时跑"

在集群环境中,一个定时任务 可能被多个节点同时执行,很危险 ⚠️。

常见解决方案

✅ 1️⃣ Redis 分布式锁
java 复制代码
@Scheduled(cron = "0 */5 * * * ?")
public void task() {
    if (redisLock.tryLock("order_task")) {
        try {
            // 业务逻辑
        } finally {
            redisLock.unlock("order_task");
        }
    }
}
✅ 2️⃣ ShedLock(强烈推荐)
java 复制代码
@Scheduled(cron = "0 0 1 * * ?")
@SchedulerLock(name = "cleanTask", lockAtMostFor = "10m")
public void cleanData() {
    // 只会有一个实例执行
}

相关推荐
追逐时光者2 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 65 期(2026年1.1-1.11)
后端·.net
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
gelald2 小时前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
且去填词2 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
better_liang2 小时前
每日Java面试场景题知识点之-XXL-JOB分布式任务调度实践
java·spring boot·xxl-job·分布式任务调度·企业级开发
会游泳的石头2 小时前
一行注解防死循环:MyBatis 递归深度限制(无需 level 字段)
java·mybatis
q***o3762 小时前
Spring Boot环境配置
java·spring boot·后端
hhzz2 小时前
Springboot项目中使用POI操作Excel(详细教程系列3/3)
spring boot·后端·excel·poi·easypoi
oMcLin2 小时前
如何在SUSE Linux Enterprise Server 15 SP4上通过配置并优化ZFS存储池,提升文件存储与数据备份的效率?
java·linux·运维