image.png定时任务

定时任务的使用场景主要如下:

  • 时间驱动处理场景:每分钟扫描超时支付的订单,活动状态刷新,整点发送优惠券。
  • 批量处理数据:按月批量统计报表数据,批量更新短信状态,实时性要求不高。

年度最佳定时任务:每个月初的工资单的推送!!!
项目基于 Quartz + MySQL 实现分布式定时任务,并提供 [基础设施 -> 定时任务] 菜单,进行定时任务的统一管理,支持动态控制任务的添加、修改、开启、暂停、删除、执行一次等操作。
image.png

  • ykkj-spring-boot-starter-job技术组件:基于 Quartz 框架的封装,提供简便的 framework/quartz/core/handler/JobHandler.java接入,任务的执行、重试,执行日志的记录。
  • ykkj-module-infra 的 module/infra/service/job/业务模块,提供任务的动态管理,执行日志的存储。

    1. Quartz 配置

    在 application-local.yaml配置文件中,通过 spring.quartz 配置项,设置 Quartz 使用 MySQL 实现集群。如下图所示:
    image.png
    考虑到 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 技术组件。如下所示: ```xml cn.iocoder.boot yudao-spring-boot-starter-job
  1. <a name="XDVp2"></a>
  2. ### 2.2 UserSessionTimeoutJob
  3. 每个 ykkj-module-xxx-biz 模块的 job 包,用于定义定时任务的 Job 类。<br />因此,在 ykkj-module-system-biz 模块的 job 包下,创建 module/system/job/auth/UserSessionTimeoutJob.java类,实现 JobHandler接口,执行用户 Session 超时 Job。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652264785379-e5f51f68-74dc-4f75-a7f5-8f42067ea3c2.png#clientId=uce1f0e2b-8170-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ue4adc3e9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=376&originWidth=788&originalType=url&ratio=1&rotation=0&showTitle=false&size=86271&status=done&style=none&taskId=u167de767-6a5e-4b40-8da2-276db11bcd1&title=)<br />**疑问:为什么添加 @TenantJob 注解?**<br />声明 @TenantJob注解在 Job 类上,实现**并行**遍历每个租户,执行定时任务的逻辑。<br />更多多租户的内容,可见 《开发指南 —— SaaS 多租户》文档。
  4. <a name="hAid3"></a>
  5. ### 2.3 配置任务
  6. ① 点击 [新增] 按钮,填写定时任务 UserSessionTimeoutJob 的信息。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652264785439-df839792-7e2d-4eff-b398-48d504c63d30.png#clientId=uce1f0e2b-8170-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u51df172b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=602&originWidth=1625&originalType=url&ratio=1&rotation=0&showTitle=false&size=133721&status=done&style=none&taskId=ubdfc4a84-25e8-4db9-b516-31df77e8580&title=)
  7. - 处理器的名字:对应的 Spring Bean 名字。例如说 UserSessionTimeoutJob 对应 userSessionTimeoutJob
  8. - Cron 表达式:执行周期,可通过 [生成表达式] 功能,进行生成 ![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652264785802-7acac42e-1831-409b-9b44-e8d320f9686d.png#clientId=uce1f0e2b-8170-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u2a248437&margin=%5Bobject%20Object%5D&name=image.png&originHeight=701&originWidth=818&originalType=url&ratio=1&rotation=0&showTitle=false&size=76719&status=done&style=none&taskId=u4ffc96f2-1ccb-438e-b872-b1d5d2ed863&title=)
  9. - 重试次数、重试间隔:执行失败后,立即重试的次数以及重试的间隔时间
  10. - 超时时间监控:执行超过该时间后,发送告警邮件给开发【暂不支持,未来实现】
  11. 常用的 Cron 表达式如下:
  12. ```xml
  13. 0 0 10,14,16 * * ? 每天上午 10 点,下午 2 点、4 点
  14. 0 0/30 9-17 * * ? 朝九晚五工作时间内,每半小时
  15. 0 0 12 ? * WED 表示每个星期三中午 12 点
  16. 0 0 12 * * ? 每天中午 12 点触发
  17. 0 15 10 ? * * 每天上午 10:15 触发
  18. 0 15 10 * * ? 每天上午 10:15 触发
  19. 0 15 10 * * ? * 每天上午 10:15 触发
  20. 0 15 10 * * ? 2005 2005 年的每天上午 10:15 触发
  21. 0 * 14 * * ? 在每天下午 2 点到下午 2:59 期间,每 1 分钟触发
  22. 0 0/5 14 * * ? 在每天下午 2 点到下午 2:55 期间,每 5 分钟触发
  23. 0 0/5 14,18 * * ? 在每天下午 2 点到 2:55 期间和下午 6 点到 6:55 期间,每 5 分钟触发
  24. 0 0-5 14 * * ? 在每天下午 2 点到下午 2:05 期间,每 1 分钟触发
  25. 0 10,44 14 ? 3 WED 每年三月的星期三的下午 2:10 和 2:44 触发
  26. 0 15 10 ? * MON-FRI 周一至周五的上午 10:15 触发
  27. 0 15 10 15 * ? 每月15日上午 10:15 触发
  28. 0 15 10 L * ? 每月最后一日的上午 10:15 触发
  29. 0 15 10 ? * 6L 每月的最后一个星期五上午 10:15 触发
  30. 0 15 10 ? * 6L 2002-2005 2002 年至 2005 年,每月的最后一个星期五上午 10:15 触发
  31. 0 15 10 ? * 6#3 每月的第三个星期五上午 10:15 触发

② 点击 [更多 -> 任务详情] 按钮,可以查看任务的基础信息、后续的执行时间。如下图所示:
image.png

2.4 测试任务

① 点击 [更多 -> 执行一次] 按钮,立即执行一次 UserSessionTimeoutJob 定时任务。可以在 IDEA 控制台看到输出,如下图所示:
image.png
② 点击 [更多 -> 调度日志] 按钮,可以查看到 UserSessionTimeoutJob 的执行日志。如下图所示:
image.png