文档

10分钟快速体验XXLJOB

更新时间:
一键部署

本文介绍如何10分钟快速体验XXLJOB工程。

前提条件

开通MSE微服务引擎。登录微服务引擎MSE,点击开通。会授权阿里云XXLJOB访问您拥有的其他阿里云资源。

方案概览

10分钟快速体验XXLJOB大致分为3步,如下:

  1. 创建XXLJOB实例集群及应用:创建XXLJOB所需实例集群及应用。

  2. 部署Demo工程到容器:在ACK或SAE服务快速部署启动Demo应用。

  3. 测试验证:进行接入验证,并验证任务的创建与执行。

步骤一:创建XXLJOB实例集群及应用

  • 创建XXLJOB实例。具体操作,请参见创建实例

  • 创建XXLJOB应用。具体操作,请参见创建应用

步骤二:部署Demo工程到容器

产品提供了公共的业务应用Demo镜像:registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0。可通过以下两种方式,选择其一部署Demo应用接入XXLJOB实例测试体验。

重要

确保任务部署集群和XXLJOB集群在同一VPC中,且应用节点所在的安全组入方向配置允许 VPC 网段的访问。

通过ACK Serverless部署

  1. 创建容器服务集群。登录阿里云容器服务控制台,创建一个ACK Serverless集群。需要为当前VPC开启配置“SNAT”(VPC已配置过则可忽略),以便拉取Demo镜像。

    image

  2. 登录微服务引擎MSE,选择任务调度 > XXL-JOB版,进入指定XXLJOB实例。在应用管理页面,单击接入配置

    image

  3. 将接入配置替换到JAVA_OPTS中,并通过该YAML创建资源。进入第一步中创建的集群环境,选择工作负载 > 无状态服务,点击使用YAML创建资源,将YAML配置填充启动。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: xxljob-demo
      labels:
        app: xxljob-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: xxljob-demo
      template:
        metadata:
          labels:
            app: xxljob-demo
        spec:
          containers:
          - name: xxljob-executor
            image: registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0
            ports:
            - containerPort: 9999
            env:
              - name: JAVA_OPTS
                value: >-
                  -Dxxl.job.admin.addresses=http://xxljob-xxxxx.schedulerx.mse.aliyuncs.com
                  -Dxxl.job.executor.appname=xxxxx
                  -Dxxl.job.accessToken=xxxxxxx

通过SAE部署

  1. 创建Serverless应用集群。登录阿里云Serverless应用引擎SAE,进入应用管理 > 微服务应用,单击创建应用,创建一个微服务应用。

    image

  2. 应用基本配置信息向导页,选择已有命名空间,选择对应VPC下的交换机/安全组。点击设置镜像,切换到自定义镜像,输入Demo镜像地址:registry.cn-hangzhou.aliyuncs.com/schedulerx/xxljob-demo:2.2.0后,单击下一步

    image

    说明

    对应命名空间需要绑定XXLJOB实例集群所在的VPC。

  3. 高级设置向导页,配置JAVA_OPS环境变量。

    image

    环境变量值参数获取如下:

    登录微服务引擎MSE,选择任务调度 > XXL-JOB版,进入指定XXLJOB实例。在应用管理页面,单击接入配置

    image

  4. 单击创建应用,等待应用实例创建完成。

步骤三:测试验证

3.1执行器接入验证

在容器服务部署完Demo工程后,可在微服务引擎MSE,选择任务调度 > XXL-JOB版,进入指定XXLJOB实例。在左侧菜单栏单击应用管理,单击执行器数量,可看到接入的执行器。

image

3.2任务测试验证

官方提供了一个Demo镜像中包含了测试Job代码,以供快速测试验证,其中包含如下jobHandler

  • 单机任务JobHandlerhelloworld

  • 分片广播任务JobHandlershardingJobHandler

参考代码内容如下

@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);

    @XxlJob("helloworld")
    public ReturnT<String> helloworld(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World, param=" + param);
        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        System.out.println("XXL-JOB, Hello World, finished");
        return ReturnT.SUCCESS;
    }


    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        System.out.println("XXL-JOB, Hello World, start...");
        for (int i = 0; i < 5; i++) {
            System.out.println("beat at:" + i);
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        System.out.println("XXL-JOB, Hello World, end...");
        return ReturnT.SUCCESS;
    }


    /**
     * 2、分片广播任务
     */
    @XxlJob("shardingJobHandler")
    public ReturnT<String> shardingJobHandler(String param) throws Exception {

        // 分片参数
        ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
        XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());

        // 业务逻辑
        for (int i = 0; i < shardingVO.getTotal(); i++) {
            if (i == shardingVO.getIndex()) {
                XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);
            } else {
                XxlJobLogger.log("第 {} 片, 忽略", i);
            }
        }

        return ReturnT.SUCCESS;
    }


    /**
     * 3、命令行任务
     */
    @XxlJob("commandJobHandler")
    public ReturnT<String> commandJobHandler(String param) throws Exception {
        String command = param;
        int exitValue = -1;

        BufferedReader bufferedReader = null;
        try {
            // command process
            Process process = Runtime.getRuntime().exec(command);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());
            bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));

            // command log
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                XxlJobLogger.log(line);
            }

            // command exit
            process.waitFor();
            exitValue = process.exitValue();
        } catch (Exception e) {
            XxlJobLogger.log(e);
        } finally {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
        }

        if (exitValue == 0) {
            return IJobHandler.SUCCESS;
        } else {
            return new ReturnT<String>(IJobHandler.FAIL.getCode(), "command exit value("+exitValue+") is failed");
        }
    }

    /**
     * 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
     */
    @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
    public ReturnT<String> demoJobHandler2(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        return ReturnT.SUCCESS;
    }
    public void init(){
        logger.info("init");
    }
    public void destroy(){
        logger.info("destory");
    }
    
    @XxlJob(value = "failedJobHandler")
    public ReturnT<String> failedJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        int a = 1/0;
        return ReturnT.SUCCESS;
    }

}

单机任务测试

单机任务表示每次执行在该应用下的所有执行器中按照路由策略选一台幂等执行。

  1. 微服务引擎MSE下,选择任务调度 > XXL-JOB版,进入指定XXLJOB实例。

  2. 左侧菜单栏的任务管理,单击创建任务。在基本配置表单中,填写任务名称jobHandler 名称选择helloworld路由策略选择轮询,并关联应用,然后单击下一步

    image

  3. 定时配置表单,选择cron表达式,通过工具生成每天12点跑一次。然后单击下一步。

    image

  4. 创建完成后,单击运行一次

    image

  5. 单击调度记录,可查看执行记录。

    image

    image

  6. 单击日志,查看执行日志结果。

    image

分片广播任务测试

广播分片表示每次执行会广播该应用下所有执行器执行,每个执行器能拿到不同的分片号,可以用来做分布式批处理。开源XXLJOB分片广播无聚合功能,阿里云XXLJOB可以聚合展示每次执行的所有分片情况。

  1. 微服务引擎MSE下,选择任务调度 > XXL-JOB版,进入指定XXLJOB实例。

  2. 左侧菜单栏的任务管理,单击创建任务。填写任务名称jobHandler 名称选择shardingJobHandler路由策略选择分片广播。然后单击下一步

    image

  3. 选择cron表达式,通过工具生成每小时第10分执行。然后单击下一步

    image

  4. 创建完成后,单击运行一次

    image

  5. 单击调度记录,可以查看执行记录。

    image

  6. 单击详情 > 分片详情,可聚合展示每台机器的执行情况。

    image

  7. 针对每个分片,单击日志,都可以查看日志。

    image