• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SpringBoot中的定时任务的同步与异步

springboot 海叔叔 9小时前 4次浏览 已收录 0个评论

定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务调度方式的优缺点,以便为日后选择的时候提供一定的参考。

本篇要点
介绍Timer实现定时任务。

介绍ScheduledExecutorService实现定时任务。

介绍SpringBoot使用SpringTask实现定时任务。

介绍SpringBoot使用SpringTask实现异步任务。

Timer实现定时任务

基于JDK自带的java.util.Timer,通过调度java.util.TiMetask让某一段程序按某一固定间隔,在某一延时之后定时执行。

缺点:

1、无法指定某一时间的时候执行。
2、存在潜在bug,Timer运行多个TiMetask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行。

ScheduledExecutorService实现定时任务

阿里巴巴开发规范明确规定:希望开发者使用ScheduledExecutorService代替Timer。

多线程并行处理定时任务时,Timer运行多个TiMetask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。

SpringBoot使用Spring Task实现定时任务

自动配置实现原理
Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor,TaskScheduler接口,而SpringBoot的自动配置类org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration为我们默认注入了他们的实现:ThreadPoolTaskScheduler,本质上是ScheduledExecutorService 的封装,增强在调度时间上的功能。

新建工程,引入依赖
Spring Task是Spring Framework中的模块,我们只需引入spring-boot-starter依赖就可以了。

[email protected]

@Component表明该类需要被扫描,以便于Spring容器管理。
@Scheduled标注需要调度执行的方法,定义执行规则,其必须指定cron、fixedDelay或fixedRate三个属性其中一个。
cron:定义Spring cron表达式,网上有在线cron生成器,可以对照着编写符合需求的定时任务。
fixedDelay :固定执行间隔,单位:毫秒。注意,以调用完成时刻为开始计时时间。
fixedRate :固定执行间隔,单位:毫秒。注意,以调用开始时刻为开始计时时间。
主启动类

定义配置文件
Spring Task 调度任务的配置,对应 TaskSchedulingProperties 配置类。SpringBoot允许我们在yml或properties定制这些外部化配置,如果不配置也是没有关系的,自动配置已经给你一套默认的值了。

启动项目测试

SpringTask异步任务

[email protected]@EnableScheduling同步定时任务之外,[email protected]@EnableAsync 开启异步的定时任务调度。

SpringBoot自动配置类对异步的支持:org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration

配置文件

同步与异步对比

同时开启同步和异步任务,假设任务本身耗时较长,且间隔较短:间隔1s,执行10s,同步与异步执行的差异就此体现。
同步任务并没有每间隔1s就执行,而是串行在一起,等前一个任务执行完才执行。而异步任务则不一样,成功将串行化的任务并行化。


喜欢 (1)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址