定时任务
单机
Timer
ScheduledExecutorService
- 常用ScheduledThreadPoolExecutor
Spring Task底层是基于ScheduledThreadPoolExecutor
时间轮(底层基于数组)
分布式
Quartz
-
优点: 可以与 Spring 集成,并且支持动态添加任务和集群。
-
缺点 :分布式支持不友好,没有内置 UI 管理控制台、使用麻烦(相比于其他同类型框架来说)
-
三个组件
-
Schedule调度器
- 指定频率
-
Trigger触发器
- 将Job和Schedule绑定在一起
-
Job任务
-
-
模式
-
单机模式
-
Job继成QuartzJobBean,实现 #executeInternal
- QuartzJobBean 实现了 org.quartz.Job 接口
-
ScheduleConfiguration
-
配置JobDetail
- 指定具体的Job
-
配置Trigger
- 在Trigger里面配置Schedule
-
-
-
集群模式
-
在生产环境下,一定一定一定要使用 Quartz 的集群模式,保证定时任务的高可用
-
@DisallowConcurrentExecution 注解
- 保证相同 JobDetail 在多个 JVM 进程中,有且仅有一个节点在执行
-
使用 Quartz 的 JDBC 存储器 JobStoreTX ,使用 MySQL 作为数据库
-
yml的quartz相关配置
-
初始化 Quartz 表结构
-
创建 quartz 数据源
- 注意指定BeanName
-
定时任务配置
-
Bean 自动设置
- 就是单机那样的设置
-
Scheduler 手动设置(推荐使用)
- 和单机配置的类似,只是最后添加调度任务scheduler.scheduleJob(jobDetail, trigger),将 JobDetail 和 Trigger 持久化到数据库
-
-
-
Elastic-Job
-
是当当网开源的一个基于Quartz和ZooKeeper的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好。
-
优劣
- 优点 :可以与 Spring 集成、支持分布式、支持集群、性能不错
- 缺点 :依赖了额外的中间件比如 Zookeeper(复杂度增加,可靠性降低、维护成本变高)
XXL-JOB
-
于 2015 年开源,是一款优秀的轻量级分布式任务调度框架,支持任务可视化管理、弹性扩容缩容、任务失败重试和告警、任务分片等功能,基于数据库
-
优劣
- 优点:开箱即用(学习成本比较低)、与 Spring 集成、支持分布式、支持集群、内置了 UI 管理控制台。
- 缺点:不支持动态添加任务
PowerJob
- 分布式任务调度领域的新星
使用相关
Spring与Quartz的Cron表达式貌似有区别,在Spring中如下:
1.cron在Spring中表达式是6位组成,不允许第七位的年份
2.在周几的的位置,1-7代表周一到周日
定时任务不阻塞功能
定时任务不该阻塞。默认是阻塞的
1)可以让业务以异步的方式,自己提交到线程池:
CompletableFuture.runAsync(() -> {
},execute);
2)支持定时任务线程池;设置类TaskSchedulingProperties
spring.task.scheduling.pool.size: 5(不同版本可能会失效)
3)让定时任务异步执行异步任务
总结:使用异步任务 + 定时任务来完成定时任务不阻塞的功能
建议:重温商城视屏里面的介绍