SchedulerX 2.0兼容XXL-JOB任务接口,支持@XxlJob新注解和@JobHandler老注解方式,您不需要修改代码,即可以将XXL-JOB任务在SchedulerX 2.0平台上进行调度。

背景信息

XXL-JOB是一个开箱即用的轻量级分布式任务调度系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,在开源社区广泛流行,已在多家公司投入使用。XXL-JOB开源协议采用的是GPL,因此云厂商无法直接商业化托管该产品,各大中小企业需要自建,增加了学习成本、机器成本、人工运维成本。阿里巴巴商业化任务调度平台SchedulerX 2.0兼容XXL-JOB任务接口,您不需要修改一行代码,即可以将XXL-JOB任务在SchedulerX 2.0平台上托管。

采用托管的XXL-JOB有以下优势:

  • 免运维、低成本

    自建XXL-JOB最少需要2个服务器和1个数据库支撑,而使用托管的XXL-JOB可以省去这些机器成本和人力运维成本。

  • 海量任务、精准调度

    开源XXL-JOB基于竞争数据库锁保证只有一个节点执行任务,对于数据库有压力。据统计,当任务超过1万,都是分钟级别的任务时,就会有比较明显的调度延时,如果是秒级别任务,延时就更加明显。SchedulerX 2.0采用分布式架构,不同的server调度不同的任务,且无锁竞争,真正实现可以水平扩展,可以支持百万级别任务调度。SchedulerX 2.0针对秒级别任务低延时的特性,采用了专门的架构,占用资源极低,可以作为实时业务的秒级别调度场景。另外,SchedulerX 2.0还支持一次性任务,可以指定未来某个时刻执行一次任务,执行完任务自动销毁,可以作为定时通知、订单定时关闭等场景。

  • 高级特性
    • 工作流:通过可视化的工作流进行任务编排。
    • 限流:可抢占的任务优先级队列。
    • 资源隔离:支持命名空间和应用级别资源隔离,支持多租户权限管理。
  • 高可用

    SchedulerX 2.0采用高可用架构,任务多备份机制,经历过阿里集团多年双十一、容灾演练等场景的考验,可以做到整个集群挂掉任意2个节点或者任意一个机房断电,任务调度都不会收到影响。

  • 商业化报警运维

    SchedulerX 2.0除了兼容XXL-JOB的邮件报警和基本运维操作,还提供了商业化报警和运维功能:

    • 报警:通过钉群、短信、电话等发送通知。
    • 运维:支持原地重跑、重刷数据、标记成功、查看堆栈、停止任务等操作。

与开源XXL-JOB的区别

功能 开源XXL-JOB SchedulerX为底座的XXL-JOB任务
Bean模式 不兼容新版本@XxlJob注解和老版本@JobHandler注解 同时兼容@XxlJob注解和@JobHandler注解
GLUE(Java) 支持 不支持
Shell 支持 支持
Nodejs 支持 支持
HTTP 不支持 支持
单机 支持 支持
分片广播 支持 支持
路由策略 第一个、最后一个、轮询、随机等 轮询
定时 cron cron、fixed_rate、fixed_delay、one_time
工作流 不支持 支持
运维操作 运行一次 运行一次、原地重跑、重刷数据、标记成功、停止运行
报警 邮件 邮件、钉钉群、短信、电话

接入配置

  1. 应用的pom.xml文件做如下变更:将com.xuxueli:XXL-JOB-core的依赖去除,增加SchedulerX客户端的依赖和com.aliyun:schedulerx2-plugin-xxljob插件。

    因为XXL-JOB在2.3.x版本重构了接口,请根据XXL-JOB的版本选择不同的接入方式,以schedulerx2-spring-boot-starter应用为例,配置内容如下:

    • 2.3.x版本接入

      <!-- 注释xxl-job-core -->
      <!--
      <dependency>
          <groupId>com.xuxueli</groupId>
          <artifactId>xxl-job-core</artifactId>
          <version>${project.parent.version}</version>
      </dependency>
      -->
      
      <dependency>
          <groupId>com.aliyun.schedulerx</groupId>
          <artifactId>schedulerx2-spring-boot-starter</artifactId>
          <version>1.4.0</version>
      </dependency>
      
      <dependency>
          <groupId>com.aliyun.schedulerx</groupId>
          <artifactId>schedulerx2-plugin-xxljob</artifactId>
          <version>2.3.0</version>
      </dependency>
    • 2.3.x以下版本接入

      <!-- 注释xxl-job-core -->
      <!--
      <dependency>
          <groupId>com.xuxueli</groupId>
          <artifactId>xxl-job-core</artifactId>
          <version>${project.parent.version}</version>
      </dependency>
      -->
      
      <dependency>
          <groupId>com.aliyun.schedulerx</groupId>
          <artifactId>schedulerx2-spring-boot-starter</artifactId>
          <version>1.4.0</version>
      </dependency>
      
      <dependency>
          <groupId>com.aliyun.schedulerx</groupId>
          <artifactId>schedulerx2-plugin-xxljob</artifactId>
          <version>1.3.4.1</version>
      </dependency>
  2. agent.properties文件添加如下配置,具体操作,请参见Agent接入(调度任务)

    spring.schedulerx2.endpoint=192.xx.xx.xx
    spring.schedulerx2.namespace=20e90ffc****
    spring.schedulerx2.groupId=679xxx
    spring.schedulerx2.appKey=71BCC0Exxx

使用Xxljob方法创建任务

参考开源XXL-JOB-executor-sample-springboot工程,创建方法任务,示例代码如下:

/**     
* 简单任务示例(Bean模式)     
*/ 
   @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        System.out.println("XXL-JOB, " + param);
        return ReturnT.SUCCESS;
    }
  1. 在左侧导航栏单击任务管理
  2. 在应用列表页面顶部菜单栏选择地域,在页面中选择目标微服务空间,然后单击创建任务。参数配置,请参见创建调度任务
    job
  3. 任务管理页面,单击目标任务操作列下的运行一次
  4. 任务管理页面,单击目标任务操作列下的更多图标,单击历史记录,查看任务参数。

使用JobHandler方法创建任务

示例代码如下:

@JobHandler(value="HelloJobHandler")
@Componentpublic class HelloJobHandler extends IJobHandler {
    @Override
    public ReturnT<String> execute(String param) throws Exception {
        System.out.println("HelloJobHandler: " + param);
        return SUCCESS;
    }
}
  1. 在左侧导航栏单击任务管理
  2. 在应用列表页面顶部菜单栏选择地域,在页面中选择目标微服务空间,然后单击创建任务。参数配置,请参见创建调度任务
    hellojob
  3. 任务管理页面,单击目标任务操作列下的运行一次
  4. 任务管理页面,单击目标任务操作列下的更多图标,单击历史记录,查看任务参数。

使用分片广播的方式创建任务

以XxlJob方法注解为例,示例代码如下:

/**
* 分片广播任务
*/
    @XxlJob("shardingJobHandler")
    public ReturnT<String> shardingJobHandler(String param) throws Exception {
        // 分片参数
        int shardIndex = XxlJobContext.getXxlJobContext().getShardIndex();
        int shardTotal = XxlJobContext.getXxlJobContext().getShardTotal();
        XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
        System.out.println("分片参数:当前分片序号 ="+ shardIndex + ", 总分片数 = " + shardTotal);
        // 业务逻辑
        for (int i = 0; i < shardTotal; i++) {
            if (i == shardIndex) {
                System.out.println("第 " + i + " 片, 命中分片开始处理");
                XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);
            } else {
                XxlJobLogger.log("第 {} 片, 忽略", i);
            }
        }
        return ReturnT.SUCCESS;
    }
  1. 在左侧导航栏单击任务管理
  2. 在应用列表页面顶部菜单栏选择地域,在页面中选择目标微服务空间,然后单击创建任务。参数配置,请参见创建调度任务
    guangbo
  3. 任务管理页面,单击目标任务操作列下的运行一次
  4. 任务管理页面,单击目标任务操作列下的更多图标,单击历史记录,查看任务参数。

XXL-JOB任务批量迁移

  • XXL-JOB导出f任务配置

    1. 下载导出工具
    2. 解压工具包,在application.properties文件中进行导出配置。GG

      配置参数如下:

      ### xxl-job, datasource
      datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
      datasource.username=root
      datasource.password=123456
      datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      
      ### 配置对应要导出的app-name(该步骤可选,不设置的情况下导出所有任务分组)
      #xxl-job.app-name=xxl-job-executor-sample
    3. 执行./start.sh命令运行导出操作。SS
    4. 执行完成后,在当前目录下获得xxljob_*******.json的任务配置文件(仅Bean模式的任务配置信息)。
  • XXL-JOB任务导入SchedulerX 2.0

    1. 登录SchedulerX 2.0控制台。
    2. 在左侧导航栏单击任务管理
    3. 任务管理页面上方单击导入任务
    4. 选择待导入的任务配置文件后单击导入,即可完成XXL-JOB任务配置信息和SchedulerX任务配置信息的同步。