文档

如何在SchedulerX 2.0平台上托管XXL-JOB任务

更新时间:
一键部署

阿里巴巴商业化任务调度平台SchedulerX 2.0兼容XXL-JOB任务接口,支持@XxlJob新注解和@JobHandler老注解方式。您无需修改代码,即可以将XXL-JOB任务在SchedulerX 2.0平台上托管。本文介绍在SchedulerX 2.0平台上托管的优势和方法。

功能优势

免运维和低成本

自建XXL-JOB至少需要2个服务器+1个数据库。托管XXL-JOB可以节省机器成本和人力运维成本。

兼容升级

XXL-JOB不同版本间存在不兼容,导致在升级SDK版本时,往往需要对业务代码进行重构以实现适配。而SchedulerX 2.0则展现出卓越的兼容性优势,它无缝对接XXL-JOB各版本接口与注解体系,确保用户在任何SDK升级过程中,无需对既有业务代码进行任何改动。

海量任务和精准调度

开源XXL-JOB基于分布式数据库锁保证只有一个节点执行任务,对于数据库有压力。据统计,当任务超过1万,且都是分钟级别的任务时,会有比较明显的调度延时。如果是秒级别任务,延时更加明显。

SchedulerX 2.0采用分布式架构,不同的Server调度不同的任务,且无锁竞争,实现水平扩展,可支持百万级别任务调度。针对秒级别任务低延时的特性,采用了专门的架构,占用资源极低,可以作为实时业务的秒级别调度场景。SchedulerX 2.0还支持一次性任务,可以指定某个时刻执行一次任务,执行完任务自动销毁,适用于定时通知、订单定时关闭等场景。

丰富的可视化能力

查看用户大盘

1

查看任务历史记录

2

查看用户运行日志

3

查看任务运行堆栈

4

查看任务操作记录

5

高级特性

任务编排

支持工作流(DAG)进行任务编排,可通过拖拽对前端进行操作。详细的任务状态图方便您了解下游任务执行失败的原因。

6

限流

常见场景为夜间离线报表业务。例如,很多报表任务是凌晨1点或者2点开始,需控制应用最大并发的任务数量(否则业务无法支撑),达到并发上限的任务会在队列中等待。若同时要求早上9点前必须完成KPI报表,可以设置KPI任务高优先级,高优先级任务会抢占低优先级任务,从而实现优先调度。

SchedulerX 2. 0支持可抢占的任务优先级队列,只需要在控制台配置即可。

7

资源隔离

支持命名空间和应用级别资源隔离,支持多租户权限管理。

商业化报警运维

报警

支持通过邮件、钉钉、短信或电话进行任务执行失败、超时和无可用机器报警通知。报警内容可以查看任务失败原因。

1

运维操作

支持原地程序运行、重刷数据、标记成功、查看堆栈、停止任务和指定机器等。

2

与开源XXL-JOB的区别

与开源XXL-JOB的区别入如下表所示。

功能

开源XXL-JOB

SchedulerX为底座的XXL-JOB任务

Java任务

对

对

Go任务

对

对

脚本任务

对

对

HTTP任务

错

对

单机

对

对

分片广播

对

对

MapReduce模型

错

对

路由策略

第一个、最后一个、轮询、随机等

轮询

定时

cron

cron、fixed_rate、fixed_delay、one_time

工作流

错

对

运维操作

运行一次、停止运行

运行一次、停止运行、原地重跑、重刷数据、标记成功

日志查询

日志存在executor本地,机器挂了日志丢失

日志存储在阿里云日志服务,保留最近2周,支持搜索

可观测

历史记录、运行大盘

历史记录、运行大盘、操作记录、查看堆栈、链路追踪

报警监控

邮件

邮件、钉钉、飞书、企业微信、自定义WebHook、短信、电话

高可用及容灾

需要自己维护数据库和Server的容灾

默认支持同城多机房容灾

用户权限

用户隔离,通过账号密码登录

支持单点登录、主子账号、角色、RAM精细化权限管理

优雅下线

对

对

全链路灰度

错

对

限流

错

对

接入方法

接入配置

将com.xuxueli:xxl-job-core的依赖删除,增加SchedulerX客户端的依赖和插件:com.aliyun.schedulerx:schedulerx2-plugin-xxljob。下面以schedulerx2-spring-boot-starter接入为例:

说明

由于XXL-JOB在2.3.x版本重构了接口,所以您需要根据XXL-JOB版本选择不同的接入方式。

  1. pom.xml 中增加以下依赖,接入SchedulerX客户端。

    XXL-JOB 2.3.x版本

    <!-- 注释xxl-job-core -->
    <!--
    <dependency>
    	<groupId>com.xuxueli</groupId>
    	<artifactId>xxl-job-core</artifactId>
    	<version>${project.parent.version}</version>
    </dependency>
    -->
    <!-- 添加schedulerx依赖 -->
    <dependency>
      <groupId>com.aliyun.schedulerx</groupId>
      <artifactId>schedulerx2-spring-boot-starter</artifactId>
      <version>${schedulerx2.version}</version>
    </dependency>
    <!-- 新增schedulerx2-plugin-xxljob -->
    <dependency>
    	<groupId>com.aliyun.schedulerx</groupId>
    	<artifactId>schedulerx2-plugin-xxljob</artifactId>
    	<version>2.3.4</version>
    </dependency>

    更多信息,请参见Demo

    XXL-JOB 2.3.0以下版本

    <!-- 注释xxl-job-core -->
    <!--
    <dependency>
    	<groupId>com.xuxueli</groupId>
    	<artifactId>xxl-job-core</artifactId>
    	<version>${project.parent.version}</version>
    </dependency>
    -->
    <!-- 添加schedulerx依赖 -->
    <dependency>
      <groupId>com.aliyun.schedulerx</groupId>
      <artifactId>schedulerx2-spring-boot-starter</artifactId>
      <version>${schedulerx2.version}</version>
    </dependency>
    <!-- 新增schedulerx2-plugin-xxljob -->
    <dependency>
    	<groupId>com.aliyun.schedulerx</groupId>
    	<artifactId>schedulerx2-plugin-xxljob</artifactId>
    	<version>2.2.3</version>
    </dependency>

    更多信息,请参见Demo

  2. 在application.properties文件中增加配置。

    spring.schedulerx2.endpoint=xxxxxxx
    spring.schedulerx2.namespace=xxxxxxx
    spring.schedulerx2.groupId=xxxxxxxx
    spring.schedulerx2.appKey=xxxxxxx

创建方法任务

@XxlJob方法注解

  1. 以XXL-JOB-2.2.1接口为例,参考开源xxl-job-executor-sample-springboot工程,新建方法任务代码如下图所示:1

  2. 在SchedulerX控制台新建任务。1

  3. 手动运行一次,打印任务参数。

    2

@JobHandler类注解

  1. 新建代码如下:4

  2. 在SchedulerX控制台新建任务。5

  3. 成功打印任务参数。6

分片广播

  1. 以XXL-JOB方法注解为例,新建代码如下:6

  2. 在SchedulerX控制台新建任务。7

  3. 启动2个客户端实例并运行一次,分别打印。8

获取任务参数

  • 2.2.x版本插件获取任务入参方式:

    // 在2.2.x的插件版本中支持如下两种方式获取任务参数。
    // 1、通过方法的String入参直接获取。
    // 2、通过XxlJobHelper.getJobParam()获取任务参数。
    @XxlJob("demoJobHandler")
    public void demoJobHandler(String  jobParameters) throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World." + jobParameters);
        String jobParam = XxlJobHelper.getJobParam();
        XxlJobHelper.log("XXL-JOB, Hello World." + jobParam);
        // default success
    }
  • 2.3.x版本插件获取任务入参方式:

    // 在2.3.x的插件版本中仅支持如下方式获取任务参数。
    // 1、通过XxlJobHelper.getJobParam()获取任务参数。
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        String jobParam = XxlJobHelper.getJobParam();
        XxlJobHelper.log("XXL-JOB, Hello World." + jobParam);
        // default success
    }

XXL-JOB批量迁移

步骤一:导出xxl-job任务配置

  1. 下载工具

  2. 解压工具包,查看readme文件,在application.properties文件中进行配置。9

    ### 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
    
    #过滤指定任务描述,包含指定字符串(可选)
    #xxl-job.filter.job-desc=test
    
    #过滤指定任务作者信息,包含指定字符串 (可选)
    #xxl-job.filter.author=test
    
    #过滤指定触发状态的任务配置(0:禁用 1:启用),不配置时导出所有状态任务(可选)
    #xxl-job.filter.trigger-status=0
    
    #分页读取:按任务id排序,读取任务的启始位置,默认0(可选)
    #xxl-job.filter.page-start=0
    
    #分页读取:按任务id排序,读取任务的启始位置后多少行记录,默认无限大(可选)
    #xxl-job.filter.page-size=10
    
    
    #导出后任务默认状态值, 0:禁用, 1:启用,默认为任务原始状态 (可选)
    #xxl-job.default.job-status=0
  3. 执行./start.sh命令导出。11

  4. 执行完成后,在当前目录下获得xxljob_*******.json的任务配置文件(仅Bean模式的任务配置信息)。

步骤二:任务导入SchedulerX

  1. 登录SchedulerX控制台,单击任务管理菜单,选择导入任务12

  2. 选择XXL-JOB任务配置中导出的任务配置文件执行导入,即可完成XXL-JOB任务配置信息至SchedulerX任务配置信息的同步。

常见问题

jobprocessor is null

需初始化XxlJobSpringExecutor。示例代码:

/**
 * Copyright (c) 2022-present Alibaba Group
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.alibaba.schedulerx.example.xxljob;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        return xxlJobSpringExecutor;
    }
}

  • 本页导读 (1)
文档反馈