定时任务
定时任务的使用场景主要如下:
- 时间驱动处理场景:每分钟扫描超时支付的订单,活动状态刷新,整点发送优惠券。
- 批量处理数据:按月批量统计报表数据,批量更新短信状态,实时性要求不高。
年度最佳定时任务:每个月初的工资单的推送!!!
如果你对定时任务了解不多,可以后续阅读 《芋道 Spring Boot 定时任务入门》 (opens new window) 文章。
项目基于 Quartz + MySQL 实现分布式定时任务,并提供 [基础设施 -> 定时任务] 菜单,进行定时任务的统一管理,支持动态控制任务的添加、修改、开启、暂停、删除、执行一次等操作。
yudao-spring-boot-starter-job
(opens new window) 技术组件:基于 Quartz 框架的封装,提供简便的 JobHandler (opens new window) 接入,任务的执行、重试,执行日志的记录。yudao-module-infra
的job
(opens new window) 业务模块,提供任务的动态管理,执行日志的存储。
# 1. Quartz 配置
在 application-local.yaml
(opens new window) 配置文件中,通过 spring.quartz
配置项,设置 Quartz 使用 MySQL 实现集群。如下图所示:
考虑到 local
本地和 dev
测试环境使用相同的数据库,所以【本地】配置 spring.quartz.auto-startup
为 false
,禁用本地执行定时任务的功能,影响测试环境。
# 2. 实战案例
以用户 Session 超时的定时任务举例子,讲解在项目中使用定时任务。
注意,需要修改 application-local.yaml
配置文件,将 spring.quartz.auto-startup
为 true
,开启本地执行定任务的功能。
# 2.1 引入依赖
在 yudao-module-system-biz
模块中,引入 yudao-spring-boot-starter-job
技术组件。如下所示:
1 |
|
# 2.2 UserSessionTimeoutJob
每个 yudao-module-xxx-biz
模块的 job
包,用于定义定时任务的 Job
类。
因此,在 yudao-module-system-biz
模块的 job
包下,创建
UserSessionTimeoutJob (
opens new window)
类,实现
JobHandler (
opens new window) 接口,执行用户 Session 超时
Job。如下图所示:
疑问:为什么添加 @TenantJob 注解?
声明
@TenantJob
(
opens new window) 注解在 Job 类上,实现并行遍历每个租户,执行定时任务的逻辑。
更多多租户的内容,可见 《开发指南 —— SaaS 多租户》 ( opens new window) 文档。
# 2.3 配置任务
① 点击 [新增] 按钮,填写定时任务 UserSessionTimeoutJob 的信息。如下图所示:
处理器的名字:对应的 Spring Bean 名字。例如说 UserSessionTimeoutJob 对应 userSessionTimeoutJob
Cron 表达式:执行周期,可通过 [生成表达式] 功能,进行生成
重试次数、重试间隔:执行失败后,立即重试的次数以及重试的间隔时间
超时时间监控:执行超过该时间后,发送告警邮件给开发【暂不支持,未来实现】
常用的 Cron 表达式如下:
1 |
|
② 点击 [更多 -> 任务详情] 按钮,可以查看任务的基础信息、后续的执行时间。如下图所示:
# 2.4 测试任务
① 点击 [更多 -> 执行一次] 按钮,立即执行一次 UserSessionTimeoutJob 定时任务。可以在 IDEA 控制台看到输出,如下图所示:
② 点击 [更多 -> 调度日志] 按钮,可以查看到 UserSessionTimeoutJob 的执行日志。如下图所示: