3分钟带你搞定SpringBoot中Schedule
一、摘要
阅读完本文大概需要3分钟,本文主要分享内容如下:
- SpringBoot Schedule 实践介绍
二、介绍
在实际的业务开发过程中,我们经常会需要定时任务来帮助我们完成一些工作,例如每天早上 6 点生成销售报表、每晚 23 点清理脏数据等等。
如果你当前使用的是 SpringBoot 来开发项目,那么完成这些任务会非常容易!
SpringBoot 默认已经帮我们完成了相关定时任务组件的配置,我们只需要添加相应的注解@Scheduled
就可以实现任务调度!
三、SpringBoot Schedule 应用实践
3.1、pom 包配置
pom
包里面只需要引入Spring Boot Starter
包即可!
1 |
|
3.2、启动类启用定时调度
在启动类上面加上@EnableScheduling
即可开启定时
1 |
|
3.3、创建定时任务
Spring Scheduler
支持四种形式的任务调度!
- fixedRate:固定速率执行,例如每5秒执行一次
- fixedDelay:固定延迟执行,例如距离上一次调用成功后2秒执行
- initialDelay:初始延迟任务,例如任务开启过5秒后再执行,之后以固定频率或者间隔执行
- cron:使用 Cron 表达式执行定时任务
3.3.1、固定速率执行
你可以通过使用fixedRate
参数以固定时间间隔来执行任务,示例如下:
1 |
|
运行ScheduleApplication
主程序,即可看到控制台输出效果:
1 |
|
3.3.2、固定延迟执行
你可以通过使用fixedDelay
参数来设置上一次任务调用完成与下一次任务调用开始之间的延迟时间,示例如下:
1 |
|
控制台输出效果:
1 |
|
3.3.3、初始延迟任务
你可以通过使用initialDelay
参数与fixedRate
或者fixedDelay
搭配使用来实现初始延迟任务调度。
1 |
|
控制台输出效果:
1 |
|
3.3.4、使用 Cron 表达式
Spring Scheduler
同样支持Cron
表达式,如果以上简单参数都不能满足现有的需求,可以使用 cron 表达式来定时执行任务。
关于cron
表达式的具体用法,可以点击参考这里: https://cron.qqe2.com/
1 |
|
控制台输出效果:
1 |
|
3.4、异步执行定时任务
在介绍异步执行定时任务之前,我们先看一个例子!
在下面的示例中,我们创建了一个每隔2秒执行一次的定时任务,在任务里面大概需要花费 3 秒钟,猜猜执行结果如何?
1 |
|
控制台输入结果:
1 |
|
很清晰的看到,任务调度频率变成了每隔5秒调度一次!
这是为啥呢?
从Current Thread : scheduling-1
输出结果可以很看到,任务执行都是同一个线程!默认的情况下,@Scheduled
任务都在 Spring 创建的大小为 1 的默认线程池中执行!
更直观的结果是,任务都是串行执行!
下面,我们将其改成异步线程来执行,看看效果如何?
1 |
|
控制台输出结果:
1 |
|
任务的执行频率不受方法内的时间影响,以并行方式执行!
3.5、自定义任务线程池
虽然默认的情况下,@Scheduled
任务都在 Spring 创建的大小为 1 的默认线程池中执行,但是我们也可以自定义线程池,只需要实现SchedulingConfigurer
类即可!
自定义线程池示例如下:
1 |
|
我们启动服务,看看cron
任务示例调度效果:
1 |
|
当前线程名称已经被改成自定义scheduled-thread
的前缀!
四、小结
本文主要围绕Spring scheduled
应用实践进行分享,如果是单体应用,使用SpringBoot
内置的@scheduled
注解可以解决大部分业务需求,上手非常容易!