Spring Task详细讲解

devtools/2024/11/14 0:40:49/

✨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=6000public void fixedRateStringTask() {System.out.println("Fixed Rate String Task : " + dateFormat.format(new Date()));}
}

✨基于 SchedulingConfigurer 接口的使用

@Configuration
public class TaskSchedulerConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(taskExecutor());}@Bean(destroyMethod="shutdown")public Executor taskExecutor() {ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 设置线程池大小为5executor.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

java">@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定时方法

java">@Component
@Slf4j
public class MyTask {/***定时任务,每5秒执行一次*/@Scheduled(cron="0/5 * * * * ?")public void executeTask(){log.info("定时任务开始执行:{}",new Date());}
}

运行结果:每5秒执行一次:

3c474c9fba34403cbe8961020532ee0f.png
 

b1e5c92a80b757e5a176018b5609ef9e.gifb1e5c92a80b757e5a176018b5609ef9e.gifb1e5c92a80b757e5a176018b5609ef9e.gif总结:

综上所述,Spring Task是Spring框架中非常强大且灵活的任务调度工具。它提供了简单易用的注解和配置方式,支持基于cron表达式的定时任务调度和异步任务处理。通过合理配置和使用Spring Task,开发者可以轻松地实现各种复杂的定时任务需求。

aed057e1bed2414188b593c3a4300019.gif

                        
参考链接:https://blog.csdn.net/weixin_64178283/article/details/142874340

 


http://www.ppmy.cn/devtools/133785.html

相关文章

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

Vagrant 没了 VirtualBox 的话可以配 Qemu

开源虚拟机软件 VirtualBox 从当初不可一世的 Sun 易手到 Oracle 之间&#xff0c;变得不那么被许多公司信任了。之前一直是用 Vagrant 搭配 VirtualBox 在 Mac 下使用 Linux 虚拟机&#xff0c;因为不需要用到 Linux 桌面&#xff0c;用 Vagrant 操作虚拟机非常方便。但现在不…

GitHub Org

运营一个GitHub Org&#xff08;组织&#xff09;是一个复杂但充满价值的过程&#xff0c;它涉及多个方面&#xff0c;包括项目管理、团队协作、代码审查、文档维护、社区建设等。以下是一篇关于如何运营GitHub Org的详细指南&#xff0c;旨在帮助组织者更好地管理和维护其GitH…

量化交易系统开发-实时行情自动化交易-3.4.2.1.Okex K线数据

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取K线数…

系统架构设计师论文:论基于构件的软件开发方法及其应用

从下列的4道试题(试题一至试题四) 中任选1道解答。请在答题纸上的指定位置处将所选择试题的题号框涂黑。若多涂或者未涂题号框,则对题号最小的一道试题进行评分。 试题一 论基于构件的软件开发方法及其应用 基于构作的软件开发 (Component-Based Software Development,CBSD…

第23天Linux下常用工具(二)

目录 第四章 GDB调试工具 4.1gdb的作用 4.2调试代码的流程 4.3gdb的安装 4.4 gdb的使用 第五章 makefile工程管理工具 5.1makefile的作用 5.2makefile的运行 5.3make的安装 5.4makefile的编写方法 5.5makefile的语法 5.6makefile使用示例 第四章 GDB调试工具 4.1g…

【爬虫分享】

爬虫分享 1、爬虫科普 视频发送于2024-10-27 14 _50.mp4 全屏预览下载附件 所以 爬虫 其实是非常 可“刑” 可“铐” 的。 2、逆向方法 算法还原 补环境 无头浏览器&#xff08;自动化&#xff09; rpc 参数生成速度&#xff1a;算法还原 > 补环境 > rpc > 无头…

基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;番茄成熟度检测在农业生产及质量控制中起着至关重要的作用&#xff0c;不仅能帮助农民及时采摘成熟的番茄&#xff0c;还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型&#xff0c;该模型使用了…