近日,由于工作上项目遇到定时任务的场景,于是就去学习了当前比较主流的一些任务调度框架,总结各框架主要功能特点如下:
Quartz
任务可持久化
程序中创建的任务会自动持久化到Mysql当中, 当出现宕机 重启后,系统中任务仍然有效,不会丢失
可设置触发器的优先级
当创建触发器时,可设定触发器的优先级,当任务的触发时间相同时,根据优先级决定调度顺序
可灵活设置触发器触发时间
有两种触发器类型
- SimpleTrigger
如果我们想在特定的时间点执行一次任务,或者在特定的时刻执行一次,接着定时执行,那么 SimpleTrigger 就能满足我们的需求。 - CronTrigger
可通过Cron设置执行时间
动态增删改查触发器和任务
同时可通过唯一标识获取到定时任务或者触发器,唯一标识有我们自定义,例如可用车牌作为唯一标识
数据传递
在创建触发器或者任务时,都可以添加数据,在任务执行时可取出数据进行处理
错失触发机制设置
当某个触发器没能在预先设置好的时间点正常触发,程序会根据设定的机制进行处理,例如立即触发、忽略等模式
Xxl-Job
总体架构
其有单独的任务调度中心(一个单独项目),需要单独部署,业务项目中需要引入xxl-job相应的依赖,并配置调度中心的地址信息,即可被调度中心管理。调度中心提供一个可视化界面(网页),让用户可以灵活、便捷的操作各任务。
可视化界面
可实时监控任务运行情况
任务持久化
使用mysql持久化
新建任务
Bean模式(两种方式如下)
- 直接在代码里添加继承自"com.xxl.job.core.handler.IJobHandler"的JobHandler类,实现其中任务方法即可
- 在代码中把任务写成方法的形式,并在方法上添加@XxlJob注解即可
GLUE模式(Java)
在此模式下,直接在可视化界面编写任务的具体代码,随时可以在线修改任务代码,比较灵活
注 :xxl-job添加任务的原理是通过请求调度中心提供的http接口实现,因此,如果我们想要在项目的业务代码中创建任务的同时指定任务的触发时间,我们需要请求调度中心提供的api来完成
效果演示
任务触发
除了可以使用Cron指定任务的执行时间,另外也可以在界面上直接点击执行任务、停止任务、启动任务等
查看日志
可在线查看任务的执行日志
任务过期处理
可以选择 忽略 或者 立即执行一次
路由策略
可选择多种路由策略 例如:
- 分片广播
执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;“分片广播” 以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。“分片广播” 和普通任务开发流程一致,不同之处在于可以获取分片参数,获取分片参数进行分片业务处理。
- 故障转移 & 失败重试
一次完整任务流程包括”调度(调度中心) + 执行(执行器)”两个阶段。
- “故障转移”发生在调度阶段,在执行器集群部署时,如果某一台执行器发生故障,该策略支持自动进行Failover切换到一台正常的执行器机器并且完成调度请求流程。
- “失败重试”发生在”调度 + 执行”两个阶段,支持通过自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
邮箱告警
任务执行失败时,默认提供邮件失败告警,可扩展短信、钉钉等方式。如果需要新增一种告警方式,只需要新增一个实现 “com.xxl.job.admin.core.alarm.JobAlarm” 接口的告警实现即可。可以参考默认提供邮箱告警实现 “EmailJobAlarm”。
同时,给大家推荐一项目,大家想要练练手开发微服务项目可以看一下
Txing组团-微服务
好啦 天下没有不散的宴席 今天就到这里啦 我们改天再会 谢谢!