本文概览:分为调度中心部署和执行器服务部署两个模块。
选用xxl-job版本::v2.1.0
1 调度平台部署
1.1单机部署
1、下载代码
1 |
git clone https://github.com/xuxueli/xxl-job.git |
2、导入sql
在mysql终端通过source命令导入sql。
1 |
/xxl-job/doc/db/tables_xxl_job.sql |
3、修改xxl-job-admin的 application.properties的数据库地址
4、xxxl-job-admin更改logback.xml,修改下日志目录
1 |
<property name="log.path" value=".logs/data/applogs/xxl-job/xxl-job-admin.log"/> |
5、启动
http://localhost:8080/xxl-job-admin ,默认账号 admin/123456。任务调度系统视图如下:
6、一个可运行demo
链接: http://https//pan.baidu.com/s/1fJyRa1OXZA72drzvhpzkJQ 提取码: b2dy
1.2 集群部署
建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
注意:
- DB配置保持一致;
- 登陆账号配置保持一致;
- 集群机器时钟保持一致(单机集群忽视);
问题:
(1)如果搭建了一个调度中心集群,此时对于一个每日05点执行的任务,那么是通过集群的那个机器进行调度呢?
2 调度平台配置
新增一个任务时属性如下:
配置属性如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
- 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置; - 任务描述:任务的描述信息,便于任务管理; - 路由策略:当执行器集群部署时,提供丰富的路由策略,包括; 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所对应的任务的一次主动调度。 - 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务; - 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试; - 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔; - 负责人:任务的负责人; - 执行参数:任务执行所需的参数; |
注意:
- 执行器。表示一个执行器服务的名字。需要在“用户管理的”tab页添加这个服务信息。
2.1 运行模式
执行器分类:Bean模式和GLUE 模式(GLUE、python、shell)两大类。
1、Glue模式
这种模式就是在调度平台写代码或者执行脚本,但是glue模式也需要有执行器服务,执行器服务此时可以理解为客户端,在客户端执行shell脚本,在执行完脚本之后和调度平台进行通信。如shell模式
添加运行脚本
2、Bean模式。
Bean模式就是搭建spring boot的执行器服务,通过开发JobHandler来实现
1 2 3 4 |
- 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; - 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例; - 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。 - 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; |
2.2 任务相关操作
1、上下线任务
通过“启动”和“停止”实现任务上下线。“执行一次”只是仅仅运行一次。
3 部署执行器
3.1 快速启动一个服务
在调度中心 https://github.com/xuxueli/xxl-job.git 代码中有一个demo。
只需要更改logback.xml,修改下日志目录,启动服务就可以。
1 |
<property name="log.path" value="./logs/applogs/xxl-job/xxl-job-admin.log"/> |
我们将源码中spring boot中demo单独独立了一个spring boot服务.链接: https://pan.baidu.com/s/11YossYKOLDoRZz4ZvZ7IIQ 提取码: fsew 。
3.2 集群部署
执行器支持集群部署,执行器集群部署时,几点要求和建议:
执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。
4 执行器服务属性介绍
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
### 为了实现自动组成到调度中心,所以这里必填 ### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 xxl.job.executor.appname=xxl-job-executor-sample ### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; xxl.job.executor.ip= ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; xxl.job.executor.port=9999 ### 执行器通讯TOKEN [选填]:非空时启用; xxl.job.accessToken= ### 日志管理 ### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效; xxl.job.executor.logretentiondays=-1 |
1、日志管理
日志路径是用来给调度平台展示日志的,这些日志内容,通过封装的XlJobLogger来打印日志
1 |
XxlJobLogger.log("beat at:" + i); |
5 问题
1、java.lang.NoSuchMethodError: io.netty.util.internal.PlatformDependent.allocateUninitializedArray(I)
参考:https://blog.csdn.net/u014209205/article/details/93970438
1 2 3 4 5 |
<dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.17</version> </dependency> |
对于版本冲突问题,参考
参考资料:
2、Github地址:https://github.com/xuxueli/xxl-job