.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:30px;margin-bottom:5px}.markdown-body h2{padding-bottom:12px;font-size:24px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:18px;padding-bottom:0}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:15px}.markdown-body h6{margin-top:5px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.markdown-body ol,.markdown-body ul{padding-left:28px}.markdown-body ol li,.markdown-body ul li{margin-bottom:0;list-style:inherit}.markdown-body ol li .task-list-item,.markdown-body ul li .task-list-item{list-style:none}.markdown-body ol li .task-list-item ol,.markdown-body ol li .task-list-item ul,.markdown-body ul li .task-list-item ol,.markdown-body ul li .task-list-item ul{margin-top:0}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:3px}.markdown-body ol li{padding-left:6px}.markdown-body .contains-task-list{padding-left:0}.markdown-body .task-list-item{list-style:none}@media (max-width:720px){.markdown-body h1{font-size:24px}.markdown-body h2{font-size:20px}.markdown-body h3{font-size:18px}}
很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使用消息传递代替部分定时任务,两者有很多可以相互替换场景。如,发货成功发短信通知客户的业务场景,我们可以在发货成功后发送MQ消息到队列,然后去消费mq消息,发送短信。但是在很多情况,MQ系统并不能承担定时任务:
当遇到这些问题的时候,就可以考虑用到定时任务了。
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
(感觉这个像水字数啊)
调度模块(调度中心):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
如图,我们可以看出xxl-job的执行方式,在调度中心建立好调度器,在代码中设定好执行器,就能够非常轻松的实现定时任务,比springboot里自带的定时任务更加的简单与可视化。
可视化就是XXL-JOB受欢迎的一个重要因素。
xxl-job的使用也很简单,搭建完调度中心之后。
1、登录调度中心,密码之类的可以自行设置,默认的端口号是8080
2、新建一个执行器,执行器就类似于一个项目,调度任务需要隶属于某个执行器,执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。 当然,调度中心也是可以集群部署的,可以通过nginx为调度中心集群做负载均衡,分配域名。
3、登录调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。
新建任务后有很多操作的选项,可以根据实际情况进行使用(强烈建议关闭没必要的定时任务,严重影响性能,如果你配置了elk,你会发现kibana里全是定时任务的日志)
4、在程序中开发:(介绍的是BEAN模式(类形式))
5、打印日志,并且可以在调度中心查看日志。但是如果是一天内多次重复调用,日志比较难查询,可以再辅以elk查询日志。同时,在新建任务的时候,也可以指定报错通知的邮箱,会在报错后发邮件通知。
类形式虽然说每个任务需要占用一个java类,但是根据接口隔离原则、单一职责原则来看,其实这样才更加符合java的设计原则。同时,因为使用了调度中心,手动注册也不成问题。
但是在一些其他地方,比如不同情况、不同时间段执行相同的任务的时候,可以采用方法形式进行开发,一方面可以复用代码逻辑,另一方面也可以开发起来更方便。
优点 | 缺点 |
---|---|
开发迅速、学习简单、轻量级、易扩展。开箱即用 | 调度中心通过获取DB锁来保证集群中执行任务的唯一性,如果短任务很多,随着调度中心集群数量增加,那么数据库的锁竞争会比较厉害,性能不好。 |
弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化 | 需要手动在调度中心添加任务不能实现自动扫描注册。 |
可视化管理界面 | |
跨语言 | |
可视化管理界面 |
还有许多关于xxl-job集群的内容大家可以去开源的官网上查看,我主要是向大家介绍一些重点内容与我自己使用的体验,具体怎么选择,如何使用,还是要根据大家自己的业务需求来进行选择。下面这张图是xxl-job和另一个常用的任务调度工具elastic-job的对比,大家也可以自己参考一下: