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 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌2 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
曹牧4 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX4 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7255 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎5 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄5 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端