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() {
    // 只会有一个实例执行
}

相关推荐
神奇小汤圆1 分钟前
MySQL的10种高级SQL,性能飞升
后端
AI探索者3 分钟前
LangGraph 人工干预:Human-in-the-loop 机制详解
后端
神奇小汤圆5 分钟前
Java并发核心:你以为AQS很复杂?无非是"两个队列"和"一个状态"
后端
shark_chili8 分钟前
Spring AI Alibaba 入门与实战:一文构建智能天气查询助手
后端
Java编程爱好者11 分钟前
Java 高频面试题总结(2026通用版)
后端
Java水解18 分钟前
Spring Boot 视图层与模板引擎
spring boot·后端
重庆穿山甲20 分钟前
Java开发者的大模型入门:Spring AI Alibaba组件全攻略(二)
前端·后端
Java水解26 分钟前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
重庆穿山甲27 分钟前
Java开发者的大模型入门:Spring AI Alibaba组件全攻略(一)
前端·后端
Java编程爱好者34 分钟前
小米二面:std::map和std::unordered_map谁更快?别只知道哈希表
后端