什么是 XXL-JOB

XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。XXL-JOB 提供了许多特性,极大简化了任务调度的开发工作,从而做到开箱即用。

XXL-JOB 的设计思想是将调度行为抽象形成 “调度中心” 公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的 JobHandler,交由 “执行器” 统一管理,“执行器”负责接收调度请求并执行对应的 JobHandler 中业务逻辑。

系统组成

  • 调度模块(调度中心):  负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;  支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE 开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器 Failover。

  • 执行模块(执行器):  负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;  接收 “调度中心” 的执行请求、终止请求和日志请求等。

自定义任务调度模块

1、引入依赖

        <!-- xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>${最新稳定版本}</version>
		</dependency>

2、自定义配置

/**
 * XXL-job配置参数
 *
 */
@Data
@ConfigurationProperties(prefix = "spring2go.xxljob")
public class XxlJobProperties {
 
   /**
    * 调度中心部署跟地址 [选填]:
    * 如调度中心集群部署存在多个地址则用逗号分隔。
    * 执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";
    * 为空则关闭自动注册;
    */
    private String adminAddresses;
 
    /**
     * 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
     */
    private String appname;
 
    /**
     * 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
     */
    private String address;
 
    /**
     * 执行器IP [选填]:
     * 默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;
     * 地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
     */
    private String ip;
 
    /**
     * 执行器端口号 [选填]:
     * 小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
     */
    private int port;
 
    /**
     * 执行器通讯TOKEN [选填]:非空时启用;
     */
    private String accessToken;
 
    /**
     * 执行器运行日志文件存储磁盘路径 [选填] :
     * 需要对该路径拥有读写权限;为空则使用默认路径;
     */
    private String logPath;
 
    /**
     * 执行器日志文件保存天数 [选填] :
     * 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
     */
    private int logRetentionDays;
 
    /**
     * 是否开启xxljob
     */
    private Boolean enable = true;
}
 
 
 
 
 
@Configuration
@EnableConfigurationProperties(value = XxlJobProperties.class)
@ConditionalOnProperty(value = "spring2go.xxljob.enabled", havingValue = "true", matchIfMissing = true)
@Slf4j
public class XxlJobAutoConfiguration {
 
    //声明执行器
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties xxlJobProperties) {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses());
        xxlJobSpringExecutor.setAppname(xxlJobProperties.getAppname());
        xxlJobSpringExecutor.setAddress(xxlJobProperties.getAddress());
        xxlJobSpringExecutor.setIp(xxlJobProperties.getIp());
        xxlJobSpringExecutor.setPort(xxlJobProperties.getPort());
        xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken());
        xxlJobSpringExecutor.setLogPath(xxlJobProperties.getLogPath());
        xxlJobSpringExecutor.setLogRetentionDays(xxlJobProperties.getLogRetentionDays());
 
        return xxlJobSpringExecutor;
    }
}

3、自定义任务 Handler

@Component
@Slf4j
public class SampleJobHandler {
 
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        log.info("XXL-JOB, Hello World.");
    }
}

4、添加配置

spring2go:
  xxljob:
    enable: true
    adminAddresses: http://10.192.180.193:7100/xxl-job-admin
    accessToken:
    appname: xxl-job-executor-sample
    address:
    ip:
    port:
    logpath: /applogs
    logretentiondays: 30

5、正常启动服务,完成执行器服务的配置是逻辑实现。

启动调度中心 xxl-job-admin

1、下载源码

从 github 地址上下载源码:https://github.com/xuxueli/xxl-job

解压源码,源码结构如下:

  • xxl-job-admin:调度中心

  • xxl-job-core:公共依赖

  • xxl-job-executor-samples:执行器 Sample 示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)

    • xxl-job-executor-sample-springboot:Springboot 版本,通过 Springboot 管理执行器,推荐这种方式;

    • xxl-job-executor-sample-frameless:无框架版本;

2、初始化 “调度数据库”

“调度数据库初始化 SQL 脚本” 位置为:/xxl-job/doc/db/tables_xxl_job.sql

3、配置部署 “调度中心”

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

修改配置文件 / xxl-job/xxl-job-admin/src/main/resources/application.properties

### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
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=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
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
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30

4、部署并启动项目

调度中心访问地址:http://localhost:7100/xxl-job-admin (该地址执行器将会使用到,作为回调地址)

默认登录账号 “admin/123456”, 登录后运行界面如下图所示。

5、配置部署 “执行器项目”

启动上述自定义的任务调度模块,该模块我们定义了默认执行器和任务 handler-demoJobHandler

启动成功后,我们将看到在执行器管理多了一个在线的地址,如下图:

6、通过调度中心执行任务

通过界面化操作,触发 demoJobHandler 一次,我们将在执行器项目的输出中看到以下内容:

XXL-JOB, Hello World.

同时我们也可以通过 corn 表达式动态触发任务,至此,一个简单的调度任务就完成。

其他

xxl-job 还支持多种特性,比如支持 GLUE 在线开发任务逻辑代码模式,相比 “Bean 模式任务” 需要在执行器项目开发部署上线,更加简便轻量。

同时还支持调度中心和执行器的集群部署,调度日志等等。详情请查阅官网,官网有非常详细的描述。

参考资料