Spring Task详细讲解
✨Spring Task简介
Spring Task 是 Spring 提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。
使用场景:
- 信用卡每月还款提醒
- 银行贷款每月还款提醒
- 火车票售票系统处理未支付订单
- 入职纪念日为用户发送通知
只要是需要定时处理的场景都可以使用Spring Task
✨Spring Task中的cron表达式
cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间。
构成规则:分为6或7个域,由空格分开,每个域代表一个含义:
秒 分 时 日 月 周 年
每个域的含义分别为:秒,分钟,小时,日,月,周,年(可选)
注意:(周 和 日 不能同时出现,若一定要同时出现,则其中一个必须为“ ?”,因为会产生冲突)
特殊字符:
- *:代表所有可能的值
- ?:不指定值,用于日和周字段,表示不关心具体值
- -:指定一个范围
- ,:列出多个值
- /:指定增量
- L:表示最后一个,例如月的最后一个星期日
- W:表示最接近指定日期的工作日
- #:表示第几个,例如周的第几个星期日
更详细的 Cron 表达式示例:
- 0 0 12 * * ?:每天中午12点触发
- 0 15 10 ? * MON-FRI:周一至周五每天上午10:15触发
- 0 0/5 * * * ?:每5分钟触发
- 0 0 1,12 * * ?:每天凌晨1点和中午12点触发
- 0 10 1 * * 6L:每个月的最后一个星期五上午10:10触发
- 0 0 10 ? * 2#3:每个月的第三个星期二上午10:00触发
✨基于 @Scheduled 注解的使用:
1、导入maven坐标spring-context(一般是已经存在的)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
2、启动类添加注解@EnableScheduling开启任务调度
@SpringBootApplication
@EnableScheduling //开启定时任务
public class MyApplication {
// ...
}
3、创建定时任务,采用注解的方式,主要是cron表达式
@Component
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// 每5秒执行一次
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
System.out.println("Fixed Rate Task : " + dateFormat.format(new Date()));
}
// 每分钟执行一次
@Scheduled(cron = "0 * * * * ?") // 注意:此处纠正了cron表达式
public void cronTask() {
System.out.println("Cron Task : " + dateFormat.format(new Date()));
}
// 上一次任务执行完成后,延迟10秒再执行
@Scheduled(fixedDelay = 10000)
public void fixedDelayTask() {
System.out.println("Fixed Delay Task : " + dateFormat.format(new Date()));
try {
Thread.sleep(5000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 使用字符串配置,更灵活,支持占位符
@Scheduled(fixedRateString = "${my.fixedRate}") // application.properties 中配置 my.fixedRate=6000
public void fixedRateStringTask() {
System.out.println("Fixed Rate String Task : " + dateFormat.format(new Date()));
}
}
✨基于 SchedulingConfigurer 接口的使用
@Configuration
public class TaskSchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 设置线程池大小为5
executor.setRemoveOnCancelPolicy(true); // 设置取消策略
executor.setThreadNamePrefix("MyScheduled-"); // 设置线程名前缀
return executor;
}
}
✨异步任务
为了避免阻塞主线程,可以将耗时的定时任务设置为异步执行。
@Component
public class AsyncScheduledTasks {
@Async
@Scheduled(fixedRate = 5000)
public void asyncTask() {
// ... 执行耗时操作 ...
}
}
@Configuration
@EnableAsync // 开启异步任务支持
public class AsyncConfig implements AsyncConfigurer {
// ... 配置异步任务线程池 ...
}
✨使用案例:
1、首先启动类添加注解@EnableScheduling
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching //开启注解方式的事务管理
@EnableScheduling //开启任务调度
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
log.info("server started");
}
}
2、task定时方法
@Component
@Slf4j
public class MyTask {
/**
*定时任务,每5秒执行一次
*/
@Scheduled(cron="0/5 * * * * ?")
public void executeTask(){
log.info("定时任务开始执行:{}",new Date());
}
}
运行结果:每5秒执行一次:
总结:
综上所述,Spring Task是Spring框架中非常强大且灵活的任务调度工具。它提供了简单易用的注解和配置方式,支持基于cron表达式的定时任务调度和异步任务处理。通过合理配置和使用Spring Task,开发者可以轻松地实现各种复杂的定时任务需求。
参考链接:https://blog.csdn.net/weixin_64178283/article/details/142874340
原文地址:https://blog.csdn.net/2301_81028896/article/details/143749545
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!