在后端开发中,执行定时任务是一个极其常见的需求,无论是每日的数据报表生成、定时的缓存清理,还是自动化同步第三方数据。借助 Spring Boot 内置的强大功能,我们只需几个简单的注解,就能实现稳定、可靠且极易维护的定时任务。
第一步:开启定时任务的总开关 (@EnableScheduling)
我们首先要告诉 Spring Boot:“嘿,我准备在这个项目里使用定时任务功能了,请帮我把相关的组件都准备好!”
这个“通知”的动作,通过一个简单的注解就能完成。找到你的 Spring Boot 项目的主启动类(通常是名为 ...Application.java 的文件),在类的声明上方添加 @EnableScheduling 注解。
package com.ruoyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling; // 1. 导入注解
/**
* 启动程序
*/
@SpringBootApplication
@EnableScheduling // 2. 加上这个注解,开启定时任务功能!
public class RuoYiApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiApplication.class, args);
}
}
原理:@EnableScheduling 注解就像一个总开关。一旦加上它,Spring Boot 在启动时就会自动创建一个后台任务调度器(Task Scheduler)。这个调度器会时刻准备着,去发现并执行我们后续定义的具体任务。
切记:如果没有这一步,后面所有的配置都将是徒劳!
第二步:创建你的任务执行类 (@Component)
接下来,我们需要一个专门的类来存放我们的定时任务逻辑。这个类必须是一个能被 Spring 容器管理的 Bean,这样调度器才能找到它。
最简单的方式就是创建一个新的 Java 类,并在其上方添加 @Component 注解。
package com.ruoyi.web.core.task;
import com.cmgii.trust.third.dtcp.service.IDtcpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 定时任务调度类
* @author YourName
*/
@Component // 1. 声明这是一个Spring组件,让Spring容器来管理它
public class SyncTask {
// 2. 注入你真正要执行业务逻辑的Service
@Autowired
private IDtcpService dtcpService;
// 我们将在这里定义具体的定时任务...
}
原理:@Component 注解告诉 Spring:“请为我这个 SyncTask 类创建一个实例,并放到你的容器里备用。” 这样,当调度器需要执行任务时,就能从容器中拿到这个实例并调用它的方法。
第三步:定义具体的定时任务 (@Scheduled)
通过在方法上添加 @Scheduled 注解来完成。在我们的 SyncTask 类中,添加如下方法:
// ... (接上一步的代码) ...
import org.springframework.scheduling.annotation.Scheduled;
@Component
public class SyncTask {
@Autowired
private IDtcpService dtcpService;
/**
* 每小时的第0分0秒执行一次,同步数据产品。
* 这是一个非常常见的定时设置。
*/
@Scheduled(cron = "0 0 * * * ?") // 3. 定义任务的执行时间表!
public void syncDataProducts() {
System.out.println("定时任务开始:同步数据产品...");
// 调用核心业务逻辑
dtcpService.syncDataProducts();
System.out.println("定时任务结束:同步数据产品完成。");
}
/**
* 演示:每5分钟执行一次,同步交易订单。
* cron = "0 */5 * * * ?"
*/
@Scheduled(cron = "0 */5 * * * ?")
public void syncTradeOrders() {
System.out.println("定时任务开始:同步交易订单...");
dtcpService.syncTradeOrders();
System.out.println("定时任务结束:同步交易订单完成。");
}
}
Cron 表达式:时间的魔法咒语
@Scheduled 注解最核心的部分就是 cron 属性,它定义了任务的执行周期。Cron 表达式是一个由6到7个字段组成的字符串,每个字段代表一个时间单位:
[秒] [分] [时] [日] [月] [周]
-
*:代表“每一个”。例如,在“小时”字段使用 * 表示“每小时”。
-
?:仅用于“日”和“周”字段,表示“不指定”。用于避免冲突。
-
/:表示步长。例如,在“分钟”字段使用 */5 表示“每5分钟”。
常用示例:
-
"0 0 2 * * ?": 每天凌晨2点整执行。
-
"0 15 10 * * ?": 每天上午10点15分执行。
-
"0 0/30 9-17 * * ?": 每天上午9点到下午5点期间,每半小时执行一次。
总结
通过以上简单的三步,已经成功构建了一个功能完备的定时任务系统:
-
开启总开关: 在主启动类上添加 @EnableScheduling。
-
创建任务类: 创建一个带有 @Component 注解的类。
-
定义具体任务: 在类的方法上添加 @Scheduled(cron = "...") 注解,并编写你的业务逻辑。