官方简介:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开拓迅速、学习大略、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
XXL-JOB的有点特性:
1、大略:支持通过Web页面对任务进行CRUD操作,操作大略,一分钟上手;

2、动态:支持动态修公理务状态、启动/停滞任务,以及终止运行中任务,即时生效;3、调度中央HA(中央式):调度采取中央式设计,“调度中央”自研调度组件并支持集群支配,可担保调度中央HA;4、实行器HA(分布式):任务分布式实行,任务"实行器"支持集群支配,可担保任务实行HA;5、注册中央: 实行器会周期性自动注册任务, 调度中央将会自动创造注册的任务并触发实行。同时,也支持手动录入实行器地址;6、弹性扩容缩容:一旦有新实行器机器上线或者下线,下次调度时将会重新分配任务;7、路由策略:实行器集群支配时供应丰富的路由策略,包括:第一个、末了一个、轮询、随机、同等性HASH、最不常常利用、最近最久未利用、故障转移、劳碌转移等;8、故障转移:任务路由策略选择"故障转移"情形下,如果实行器集群中某一台机器故障,将会自动Failover切换到一台正常的实行器发送调度要求。9、壅塞处理策略:调度过于密集实行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;10、任务超时掌握:支持自定义任务超时时间,任务运行超时将会主动中断任务;11、任务失落败重试:支持自定义任务失落败重试次数,当任务失落败时将会按照预设的失落败重试次数主动进行重试;个中分片任务支持分片粒度的失落败重试;12、任务失落败告警;默认供应邮件办法失落败告警,同时预留扩展接口,可方便地扩展短信、钉钉等告警办法;13、分片广播任务:实行器集群支配时,任务路由策略选择"分片广播"情形下,一次任务调度将会广播触发集群中所有实行器实行一次任务,可根据分片参数开拓分片任务;14、动态分片:分片广播任务以实行器为维度进行分片,支持动态扩容实行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速率。15、事宜触发:除了"Cron办法"和"任务依赖办法"触发任务实行之外,支持基于事宜的触发任务办法。调度中央供应触发任务单次实行的API做事,可根据业务事宜灵巧触发
架构+事情流程图利用场景
个人认为xxl-job比较适宜运行耗时比较长的大任务(定时大任务的估计也差不多),或者数量少耗时短的微任务;对付那种数量多或是运行韶光较短的微任务可能不太适宜(我的项目恰好是后面这种...)。
再详细点,可以细分为两类:
相同jobId:适宜数量少耗时长的大任务;不适宜数量多或耗时短的微任务,不适宜数量多耗时长且须要尽快得到实行结果的大任务。不同jobId:适宜耗时长的大任务;不适宜耗时短的微任务。以上结论是我的个人不雅观点,如有缺点请多示正。
利用1.引入jar包
<!--分布式调度 xxl-job --><dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>1.9.1</version></dependency>
2.配置XXL-JOB的数据源
# 调度中央支配跟地址:如调度中央集群支配存在多个地址则用逗号分隔。实行器将会利用该地址进行"实行器心跳注册"和"任务结果回调"xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin# 实行器"AppName"和地址信息配置:AppName实行器心跳注册分组依据;地址信息用于"调度中央要求并触发任务"和"实行器注册"。实行器默认端口为9999,实行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用。单机支配多个实行器时,把稳要配置不同实行器端口xxl.job.executor.appname=xxl-job-executor-samplexxl.job.executor.ip=xxl.job.executor.port=9999# 实行器通讯TOKEN,非空时启用xxl.job.accessToken=# 实行器运行日志文件存储的磁盘位置,须要对该路径拥有读写权限xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler# 实行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限定至少保持3天,否则功能不生效;xxl.job.executor.logretentiondays=-1
3.创建配置类
package com.macro.mall.tiny.demo.config;import com.xxl.job.core.executor.XxlJobExecutor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/ xxl-job配置文件 /@Configuration//指界说务Handler所在包路径@ComponentScan(basePackages = "com.xxx.jobhandler")public class XxlJobConfig { private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.executor.logpath}") private String logPath; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; @Bean(initMethod = "start", destroyMethod = "destroy") public XxlJobExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xxl-job config start init.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); XxlJobExecutor xxlJobExecutor = new XxlJobExecutor(); xxlJobExecutor.setAdminAddresses(adminAddresses); xxlJobExecutor.setAppName(appName); xxlJobExecutor.setIp(ip); xxlJobExecutor.setPort(port); xxlJobExecutor.setAccessToken(accessToken); xxlJobExecutor.setLogPath(logPath); xxlJobExecutor.setLogRetentionDays(-1); logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xxl-job config end init.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); return xxlJobExecutor; }}
4.创建定时任务
package com.macro.mall.tiny.demo.job;import com.macro.mall.tiny.demo.service.impl.AddCreateTableJobImpl;import com.xxl.job.core.biz.model.ReturnT;import com.xxl.job.core.handler.IJobHandler;import com.xxl.job.core.handler.annotation.JobHandler;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.Date;/ 任务Handler示例(Bean模式) 开拓步骤: 1、继续"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; 2、注册到Spring容器:添加“@Component”表明,被Spring容器扫描为Bean实例; 3、注册到实行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”表明,表明value值对应的是调度中央新建任务的JobHandler属性的值。 4、实行日志:须要通过 "XxlJobLogger.log" 打印实行日志; 5、任务实行结果列举:SUCCESS、FAIL、FAIL_TIMEOUT /@JobHandler(value = "GPS_DEVICE_LOG_JOB")@Componentpublic class GpsDeviceLogHandler extends IJobHandler { private static final Logger LOG = LoggerFactory.getLogger(GpsDeviceLogHandler.class); @Autowired private AddCreateTableJobImpl addCreateTableJobImpl; @Override public ReturnT<String> execute(String param) throws Exception { LOG.info("GPS_DEVICE_LOG_JOB==================start STAFF_STEP=========================!"); //每天晚上定时创建第二日sql表 addCreateTableJobImpl.addCreateTable(new Date()); LOG.info("===================end STAFF_STEP=========================!"); return new ReturnT(200, "实行成功:"); }}
5.项目构造
访问管理平台1.配置实行器
把稳:配置中自动注册不用多说,利用手动注入时做事器地址为支配定时器代码的做事地址,而端口号则是利用->第2步中数据源的端口号;
2.创建实行任务
按照提示填入,0 1 ? 代表每分钟实行一次。
3.效果
4.任务详细配置的含义
实行器:任务的绑定的实行器,任务触发调度时将会自动创造注册成功的实行器, 实现任务自动创造功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个实行器, 可在 "实行器管理" 进行设置;- 任务描述:任务的描述信息,便于任务管理;- 路由策略:当实行器集群支配时,供应丰富的路由策略,包括;FIRST(第一个):固定选择第一个机器;LAST(末了一个):固定选择末了一个机器;ROUND(轮询):;RANDOM(随机):随机选择在线的机器;CONSISTENT_HASH(同等性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。LEAST_FREQUENTLY_USED(最不常常利用):利用频率最低的机器优先当选举;LEAST_RECENTLY_USED(最近最久未利用):最久为利用的机器优先当选举;FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标实行器并发起调度;BUSYOVER(劳碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标实行器并发起调度;SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器实行一次任务,同时系统自动通报分片参数;可根据分片参数开拓分片任务;- Cron:触发任务实行的Cron表达式;- 运行模式:BEAN模式:任务以JobHandler办法掩护在实行器端;须要结合 "JobHandler" 属性匹配实行器中任务;GLUE模式(Java):任务以源码办法掩护在调度中央;该模式的任务实际上是一段继续自IJobHandler的Java类代码并 "groovy" 源码办法掩护,它在实行器项目中运行,可利用@Resource/@Autowire注入实行器里中的其他做事;GLUE模式(Shell):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "shell" 脚本;GLUE模式(Python):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "python" 脚本;GLUE模式(PHP):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "php" 脚本;GLUE模式(NodeJS):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "nodejs" 脚本;GLUE模式(PowerShell):任务以源码办法掩护在调度中央;该模式的任务实际上是一段 "PowerShell" 脚本;- JobHandler:运行模式为 "BEAN模式" 时生效,对应实行器中新开拓的JobHandler类“@JobHandler”表明自定义的value值;- 壅塞处理策略:调度过于密集实行器来不及处理时的处理策略;单机串行(默认):调度要求进入单机实行器后,调度要求进入FIFO行列步队并以串行办法运行;丢弃后续调度:调度要求进入单机实行器后,创造实行器存在运行的调度任务,本次要求将会被丢弃并标记为失落败;覆盖之前调度:调度要求进入单机实行器后,创造实行器存在运行的调度任务,将会终止运行中的调度任务并清空行列步队,然后运行本地调度任务;- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务实行结束并且实行成功时,将会触发子任务ID所对应的任务的一次主动调度。- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;- 失落败重试次数;支持自定义任务失落败重试次数,当任务失落败时将会按照预设的失落败重试次数主动进行重试;- 报警邮件:任务调度失落败时邮件关照的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;- 卖力人:任务的卖力人;- 实行参数:任务实行所需的参数,多个参数时用逗号分隔,任务实行时将会把多个参数转换成数组传入;
创作不易,如果这篇文章对你有用,请点个赞感激♪(・ω・)ノ!