Spring Task
Spring Task 是 Spring 框架提供的轻量级任务调度工具,支持定时任务和异步任务。以下是其核心用法:
一、基础配置
1. 启用定时任务
在配置类中添加 @EnableScheduling
注解,启用定时任务功能:
@Configuration
@EnableScheduling
public class AppConfig {}
二、定时任务
1. 创建任务类
使用 @Component
标记类,并在方法上添加 @Scheduled
注解:
@Component
public class MyTask {// 每5秒执行一次(固定频率)@Scheduled(fixedRate = 5000)public void task1() {System.out.println("Fixed Rate Task: " + new Date());}// 上一次任务结束后,延迟3秒执行(固定延迟)@Scheduled(fixedDelay = 3000)public void task2() {System.out.println("Fixed Delay Task: " + new Date());}// 使用Cron表达式(每天12点执行)@Scheduled(cron = "0 0 12 * * ?")public void task3() {System.out.println("Cron Task: " + new Date());}
}
2. 参数说明
fixedRate
:固定频率,单位毫秒。无论上一次任务是否完成,按固定间隔执行。fixedDelay
:固定延迟,单位毫秒。上一次任务完成后,间隔指定时间再执行。cron
:Cron表达式,支持复杂调度(如0 0/30 * * * ?
表示每30分钟执行)。
三、Cron表达式语法
格式:秒 分 时 日 月 周 年(可选)
- 示例:
0 0 12 * * ?
:每天中午12点执行。0 0/5 9-17 * * MON-FRI
:工作日上午9点到下午5点,每5分钟执行。
四、异步任务
结合 @Async
实现异步执行,需配合线程池:
- 启用异步支持:
@Configuration @EnableAsync public class AsyncConfig {}
- 定义异步任务:
@Component public class AsyncTask {@Async@Scheduled(fixedRate = 5000)public void asyncTask() {// 异步执行的逻辑} }
五、XML配置方式(旧版)
在 applicationContext.xml
中配置:
<!-- 启用调度 -->
<task:annotation-driven /><!-- 定义任务 -->
<task:scheduled-tasks scheduler="myScheduler"><task:scheduled ref="myTask" method="task1" cron="0 0 12 * * ?" />
</task:scheduled-tasks><task:scheduler id="myScheduler" pool-size="5" />
六、线程池配置
默认单线程执行任务,可通过实现 SchedulingConfigurer
自定义线程池:
@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));}
}
注意事项
- 线程安全:确保任务方法是线程安全的。
- 错误处理:任务内应捕获异常,避免任务终止。
- 动态任务:需通过
ScheduledTaskRegistrar
动态注册任务。
通过以上步骤,即可灵活使用 Spring Task 实现定时和异步任务调度。