1. XXL-JOB简介

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。它的有两个核心模块,一个模块叫做调度中心,另外一个模块叫做执行器,它把任务调度和任务执行分成两个部分。这样调度模块只需要负责任务的调度属性,触发调度信号。执行模块只需要接收调度信号,去执行具体的业务逻辑,两者可以各自的进行扩容和缩容。图1是一张来自官方的架构图。

2. XXL-JOB搭建

既然是一个分布式调度平台,肯定会有一个调度中心,当然执行器(被调度者)也是必不可少的,可以参考架构图。所以,使用xxl-job搭建一个demo,也必须有两个端,下面本文分别从准备工作、搭建“调度中心”、搭建“执行器”三个部分进行说明。

2.1 准备工作

2.1.1 下载源码

源码地址:https://github.com/xuxueli/xxl-job

我使用的源码是2.2.0版本,这是目前最新的release版本。

源码包含了文档(数据库初始化脚本、官方文档、架构图等)、调度中心源码、核心core、各个版本的执行器源码。如图2所示:

2.1.2 数据库准备

数据库脚本在doc路径下,将其执行之后可以创建一个数据库,如图3所示:

2.2 搭建调度中心

2.2.1 配置调度中心

将数据库连接信息和报警信息配置成自己的,配置文件如下:

### web
server.port=8080
server.servlet.context-path=/xxl-job-admin ### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false ### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/ ### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.########## ### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model ### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1 ### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory ### xxl-job, access token
xxl.job.accessToken= ### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN ## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100 ### xxl-job, log retention days
xxl.job.logretentiondays=30

2.2.2 启动调度中心

在IDEA里面直接运行,如果使用的是macOS系统的话,可能会出现错误:Failed to create parent directories for [/data/applogs/xxl-job/xxl-job-admin.log],如图4所示:

解决办法是:将logback.xml中的“/data/applogs/xxl-job/xxl-job-admin.log”改为“./data/applogs/xxl-job/xxl-job-admin.log”,如图5所示。后续在测试运行的时候,执行器端会抛出类似异常,用同样的方式可以解决。

启动之后浏览器访问http://localhost:8080/xxl-job-admin,使用默认的用户名(admin)和密码(123456)登陆之后,可以看到如图6所示页面:

2.3 搭建“执行器”

2.3.1 新建执行器项目

使用IDEA新建一个Spring Boot项目:xxl-job-executor

2.3.2 添加相关依赖和配置执行器

Maven依赖:

<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>

主要需要配置xxl-job的调度中心地址信息、xxl-job执行器相关信息。配置文件如下:

# web port
server.port=8081
# no web
#spring.main.web-environment=false # log config
logging.config=classpath:logback.xml ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job, access token
xxl.job.accessToken= ### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-test
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

还要创建一个XxlJobConfig.java配置执行器。代码如下:

@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}")
private String adminAddresses; @Value("${xxl.job.accessToken}")
private String accessToken; @Value("${xxl.job.executor.appname}")
private String appname; @Value("${xxl.job.executor.address}")
private String address; @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.executor.logretentiondays}")
private int logRetentionDays; @Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor;
}
}

当然还要添加logback.xml文件。

2.3.3 编写执行器

  1. 在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT execute(String param)"
  2. 为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。之前的2.1.0版本中不支持在方法上面添加注解,需要在类上面添加@JobHandler注解,并继承IJobHandler。
  3. 执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;

代码如下:

@Component
public class TestXxlJobHandler {
private static Logger logger = LoggerFactory.getLogger(TestXxlJobHandler.class); /**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("testJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
System.out.println(new Date() + "Test Xxl-Job~");
return ReturnT.SUCCESS;
}
}

完成之后的整个代码结构如图8所示:

3. 测试

在本机运行调度中心和执行器。

3.1 新增执行器

在调度中心新增一个测试执行器,AppName为xxl-job-executor-test,名称为测试执行器,注册方式选择自行注册即可,如图9所示:

3.2 新增任务

3.2.1 新增任务

新增一个任务,名称与代码中名称一致,配置为每2分钟执行一次,路由策略为一致性HASH,运行模式为BEAN,阻塞处理策略为单机串行,配置如图10所示:

3.2.2 配置属性

详细配置属性可以参考:

● 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;

● 任务描述:任务的描述信息,便于任务管理;

● 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;

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所对应的任务的一次主动调度。

● 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;

● 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;

● 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;

● 负责人:任务的负责人;

● 执行参数:任务执行所需的参数;

3.3 启动任务测试

启动调度任务,如图11所示:

可以查看日志或者控制台信息,运行结果满意,如图12所示:

在控制台运行报表界面也可以看到调度和执行情况,如图13所示。图中那一次调度失败是由于执行器重启,造成了调度中心调度任务的时候发现调度地址为空,所以执行失败。

参考文档:官方中文文档

分布式任务调度平台XXL-JOB快速搭建教程的更多相关文章

  1. Java 分布式任务调度平台:PowerJob 快速开始+配置详解

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.c ...

  2. 分布式任务调度平台XXL-JOB搭建教程

    关于分布式任务调度平台XXL-JOB,其实作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里我就不做过多的介绍了,关于其搭建教程,本人依照其文档搭建起来基本上也没遇到啥问题,这里通过博客的形式 ...

  3. 分布式任务调度平台XXL-JOB快速使用与问题总结

    1.XXL-JOB简介 XXL-JOB is a lightweight distributed task scheduling framework. It's core design goal is ...

  4. SpringCloud微服务实战——搭建企业级开发框架(四十二):集成分布式任务调度平台XXL-JOB,实现定时任务功能

      定时任务几乎是每个业务系统必不可少的功能,计算到期时间.过期时间等,定时触发某项任务操作.在使用单体应用时,基本使用Spring提供的注解即可实现定时任务,而在使用微服务集群时,这种方式就要考虑添 ...

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

    <分布式任务调度平台XXL-JOB>       博文转自 https://www.cnblogs.com/xuxueli/p/5021979.html 一.简介 1.1 概述 XXL-J ...

  6. 分布式任务调度平台XXL-JOB

    <分布式任务调度平台XXL-JOB>       一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...

  7. XXL-JOB分布式任务调度平台安装与部署

    配XXL-JOB分布式任务调度平台安装与部署

  8. 一文读懂分布式任务调度平台XXL-JOB

    本文主要介绍分布式任务调度平台XXL-JOB(v2.1.0版本),包括功能特性.实现原理.优缺点.同类框架比较等 基本介绍 项目开发中,常常以下场景需要分布式任务调度: 同一服务多个实例的任务存在互斥 ...

  9. 分布式任务调度平台 → XXL-JOB 实战

    开心一刻 老师:谁知道鞭炮用英语怎么说? 甲:老师!老师!我知道,鞭炮的英文是pilipala. 老师:那闪电呢? 乙:kucha kucha 老师:那舞狮呢? 丙:dong dong qiang 老 ...

随机推荐

  1. Mariadb 10.14 mysqldump error: 1049

    Mariadb 10.14 mysqldump error: 1049 Table of Contents 1. 错误信息 2. 解决方法 1 错误信息 执行表导出: mysqldump -uroot ...

  2. (二)POI-创建一个sheet页,并添加行列数据

    原文:https://blog.csdn.net/class157/article/details/92800439 1.只创建sheet页 package com.java.poi; import ...

  3. 破解版BrupSuite安装及其问题解决及环境部署

    一 下载 BrupSuite_pro_v1.7.37的压缩包百度网盘链接: https://pan.baidu.com/s/1KkuseybjpuHo-6V4_wh9vw 提取码: 3vcs 说明一下 ...

  4. ABP (.Net Core 3.1版本) 使用MySQL数据库迁移启动模板项目(1)

    最近要搭建新项目,因为还没有用过.net core,所以想用.net core的环境搭建新项目,因为不熟悉.net core的架构,所以就下载了abp项目先了解一下. 因为自己太菜了,下载了模板项目, ...

  5. Matlab 常用语法速记 1

    ===快捷帮助=== 查找帮助:doc 函数名 强制终止: ctrl + c 注释: % 清屏 clc,清临时变量窗口 clear NaN: not a number inf: infinite == ...

  6. redis编译报错总结

    redis编译报错总结: 1.不能编译没有GCC 编译工具安装报错:问题1:make时可能会报如下错误cc -c -std=c99 -pedantic -O2 -Wall -W   -g -rdyna ...

  7. elasticSearch中集群状态的guan'l

    es中集群出现上面的问题一般是磁盘空间不够引起的,就是node节点所在的磁盘空间不足引起的 es整个集群放在c盘,都快满了 说明es的磁盘已经快被使用完了,我们可以临时更新下磁盘空间大小 修改 ES分 ...

  8. css样式学习笔记

    视频参见php中文网玉女心经视频教程 讲解的相当的清楚和明白 第1章     :css快速入门 1.1     什么是css 改变html框架的样式. 1.2     css的三种引入形式 第一种形式 ...

  9. JavaWeb网上图书商城完整项目--day03-1.图书模块功能介绍及相关类创建

    1 前两天我们学习了user用户模块和图书的分类模块,接下来我们学习图书模块 图书模块的功能主要是下面的功能: 2 接下来我们创建对应的包 我们来看看对应的数据库表t_book CREATE TABL ...

  10. sklearn机器学习算法--线性模型

    线性模型 用于回归的线性模型 线性回归(普通最小二乘法) 岭回归 lasso 用于分类的线性模型 用于多分类的线性模型 1.线性回归 LinearRegression,模型简单,不同调节参数 #2.导 ...