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

相关推荐
Sayai10 分钟前
MCP Server 开发实战:Spring AI 把后端日志查询暴露给 AI Agent(7 条设计原则与踩坑实录)
java·人工智能·ai agent·spring ai·mcp
大牧师16 分钟前
Mybatis 框架教程
java·数据库·mybatis·数据持久化·orm
SunnyDays101117 分钟前
Java 合并 PDF 文件:完整合并、指定页面合并与流合并
java·开发语言·合并pdf
金銀銅鐵31 分钟前
[Java] 用GUI展示class文件顶层的 access_flags
后端·python·ai编程
源码宝1 小时前
云HIS系统源码,HIS全套源码,支持监管系统对接与二次开发
java·源码·电子病历·云his系统·程序代码·全套源码
萧瑟余晖1 小时前
Spring MVC拦截器异常处理与跨域详解
java·spring·mvc
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 17 篇):创新高与新低扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
IT_陈寒1 小时前
Vue的数组更新把我坑惨了
前端·人工智能·后端
栗子~~1 小时前
java - logstash-logback-encoder 集成 demo
java·开发语言·logback