使用xxl-job搭建可视化任务管理平台

《转载-分布式任务调度平台XXL-JOB》

简介

概述

XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

特性

  • 简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
  • 动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效;
  • 调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA;
  • 执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
  • 任务Failover:执行器集群部署时,任务路由策略选择”故障转移”情况下调度失败时将会平滑切换执行器进行Failover;
  • 一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
  • 自定义任务参数:支持在线配置调度任务入参,即时生效;
  • 调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
  • 弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
  • 邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
  • 状态监控:支持实时监控任务进度;
  • Rolling执行日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
  • GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
  • 数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
  • 任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
  • 推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
  • 任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
  • 路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
  • 运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
  • 脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本;
  • 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
  • 失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试;

下载

https://github.com/xuxueli/xxl-job/releases

环境

JDK:1.7+
Servlet/JSP Spec:3.1/2.3
Tomcat:8.5.x/Jetty9.2
Spring-boot:1.3.8/Spring4.x
Mysql:5.6+
Maven:3+

快速入门

初始化“调度数据库”

请下载项目源码并解压,获取 “调度数据库初始化SQL脚本”(脚本文件为: 源码解压根目录\xxl-job\db\tables_xxl_job.sql) 并执行即可。正常情况下,应该生成16张表;

调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;

如果mysql做主从,调度中心集群节点务必强制走主库;

编译源码

1
2
3
4
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-example:执行器Example(可直接使用执行器Example,也可以将现有项目改造成执行器使用)
xxl-job-executor-springboot-example:执行器Example,springboot版本

配置部署“调度中心”

调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行。

调度中心配置

部署项目

如果已经正确进行上述配置,可将项目编译打war包并部署到tomcat中。
访问链接:http://localhost:8080/xxl-job-admin/ ,登录后运行界面如下图所示

配置部署“执行器项目”

“执行器”项目:xxl-job-executor-example (如新建执行器项目,可参考该Example执行器项目的配置步骤;)
作用:负责接收“调度中心”的调度并执行;

maven依赖

确认pom文件中引入了 “xxl-job-core” 的maven依赖;

执行器配置

1
2
3
4
5
6
7
8
9
10
### xxl-job admin address list:调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job executor address:执行器"AppName"和地址信息配置:AppName执行器心跳注册分组依据;地址信息用于"调度中心请求并触发任务"和"执行器注册"。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP。单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.appname=xxl-job-executor-example
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job log path:执行器运行日志文件存储的磁盘位置
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/

执行器组件配置

1、JobHandler 扫描路径:自动扫描容器中JobHandler;
2、执行器Excutor配置:执行器核心配置;

部署项目

  • xxl-job-executor-example:项目编译打包成WAR包,并部署到tomcat中。
  • xxl-job-executor-springboot-example:项目编译打包成springboot类型的可执行JAR包,命令启动即可;

开发第一个任务

开发JobHandler

  • 1、 新建一个继承com.xxl.job.core.handler.IJobHandler的Java类;
  • 2、 该类被Spring容器扫描为Bean实例,如加“@Service注解”;
  • 3、 添加 “@JobHander(value=”自定义jobhandler名称”)”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。

新建任务

配置属性详细说明

  • 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 “执行器管理” 进行设置;
  • 描述:任务的描述信息,便于任务管理;
  • 路由策略:当执行器集群部署时,执行器路由规则;
    FIRST(第一个):固定选择第一个执行器;
    LAST(最后一个):固定选择最后一个执行器;
    ROUND(轮询):;
    RANDOM(随机):随机选择在线的执行器;
    CONSISTENT_HASH(一致性HASH):分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
    LEAST_FREQUENTLY_USED(最不经常使用):单个JOB对应的每个执行器,使用频率最低的优先被选举;
    LEAST_RECENTLY_USED(最近最久未使用):单个JOB对应的每个执行器,最久为使用的优先被选举;
    FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
    BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
  • Cron:触发任务执行的Cron表达式;
  • 运行模式:
    BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 “JobHandler” 属性匹配执行器中任务;
    GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 “groovy” 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;
    GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “shell” 脚本;
    GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “python” 脚本;
  • JobHandler:运行模式为 “BEAN模式” 时生效,对应执行器中新开发的JobHandler类“@JobHander”注解自定义的value值;
  • 子任务Key:每个任务都拥有一个唯一的任务Key(任务Key可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务Key所对应的任务的一次主动调度。
  • 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
    单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
    丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
    覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
  • 失败处理策略;调度失败时的处理策略;
    失败告警(默认):调度失败时,将会触发失败报警,如发送报警邮件;
    失败重试:调度失败时,将会主动进行一次失败重试调度,重试调度后仍然失败将会触发一失败告警。注意当任务以failover方式路由时,每次失败重试将会触发新一轮路由。
  • 执行参数:任务执行所需的参数,多个参数时用逗号分隔,任务执行时将会把多个参数抓换成数组传入;
  • 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;
  • 负责人:任务的负责人;

架构图

通讯模块剖析

  • 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌jetty服务器,默认端口9999;
  • 2、“执行器”执行任务逻辑;
  • 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,是针对执行器开放一套API服务;

本文转载自简书:http://www.jianshu.com/p/4c2ffb78ebe7

关注我的微信,共同分享与讨论!