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

相关推荐
东东51624 分钟前
基于vue的电商购物网站vue +ssm
java·前端·javascript·vue.js·毕业设计·毕设
她说..30 分钟前
策略模式+工厂模式实现审批流(面试问答版)
java·后端·spring·面试·springboot·策略模式·javaee
鹿角片ljp30 分钟前
力扣9.回文数-转字符双指针和反转数字
java·数据结构·算法
skywalker_1130 分钟前
网络编程篇
java·网络协议·网络编程
毕设源码-朱学姐41 分钟前
【开题答辩全过程】以 基于Java的九价疫苗预约系统为例,包含答辩的问题和答案
java·开发语言
tb_first1 小时前
SSM速通4
java·jvm·spring·tomcat·maven·mybatis
梦梦代码精1 小时前
开源、免费、可商用:BuildingAI一站式体验报告
开发语言·前端·数据结构·人工智能·后端·开源·知识图谱
百炼成神 LV@菜哥1 小时前
Kylin Linux V10 aarch64安装DBeaver
java·linux·服务器·kylin
有代理ip1 小时前
成功请求的密码:HTTP 2 开头响应码深度解析
java·大数据·python·算法·php
好好沉淀2 小时前
ES 脚本核心语法:ctx._source [‘group_id‘]
java·elasticsearch·script