任务调度

概述

定时任务接入模块,支持下列定义的定时任务:

  • xxljob任务
  • PowerJob任务
  • Spring注解任务
  • TODO,统一的macula task定义

客户端介绍

组件坐标


<dependency>
    <groupId>dev.macula.boot</groupId>
    <artifactId>macula-boot-starter-task</artifactId>
</dependency>

使用配置

接入xxljob的配置如下:

xxl:
  job:
    enabled: true                                        # 打开xxljob支持,默认是true 
    accessToken: default_token
    admin:
      #  addresses: http://127.0.0.1:8080/xxl-job-admin  # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。 执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
      name: macula-cloud-xxljob                          # 注册到注册中心的Admin的服务名称[选填],默认是xxl-job-admin,和addresses二选一
    executor:
      appname: ${spring.application.name}                # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
      #  address:                                        # 服务注册地址,优先使用该配置作为注册地址 为空时使用内嵌服务 ”IP:PORT“ 作为注册地址 从而更灵活的支持容器类型执行器动态IP和动态映射端口问题
      #  ip:                                             # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP ,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"
      #  port: 9999                                      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9099,单机部署多个执行器时,注意要配置不同执行器端口;
      logpath: ${user.home}/logs/${spring.application.name}    # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logretentiondays: 30                             # 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;

接入PowerJob的配置如下:

powerjob:
  worker:
    enabled: true                                     # 打开PowerJob支持,默认是false
    akka-port: 27777                                  # akka 工作端口,可选,默认 27777
    app-name: ${spring.application.name}              # 接入应用名称,用于分组隔离,推荐填写 本 Java 项目名称
    server-address: 127.0.0.1:7700                    # 调度服务器地址,IP:Port 或 域名,多值逗号分隔
    protocol: http                                    # 通讯协议,4.3.0 开始支持 HTTP 和 AKKA 两种协议,官方推荐使用 HTTP 协议(注意 server 和 worker 都要开放相应端口)
    store-strategy: disk                              # 持久化方式,可选,默认 disk
    max-result-length: 4096                           # 任务返回结果信息的最大长度,超过这个长度的信息会被截断,默认值 8192
    max-appended-wf-context-length: 4096              # 单个任务追加的工作流上下文最大长度,超过这个长度的会被直接丢弃,默认值 8192
    max-lightweight-task-num: 1024                    # 同时运行的轻量级任务数量上限
    max-heavy-task-num: 64                            # 同时运行的重量级任务数量上限

核心功能

使用@XxlJob注解定义任务

/**
 * XxlJob开发示例(Bean模式)
 *
 * 开发步骤: 1、任务开发:在Spring Bean实例中,开发Job方法; 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法",
 * destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
 * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
 *
 * @author xuxueli 2019-12-11 21:52:51
 */
@Component
public class XxlJobDemoHandler {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }

    /**
     * 3、命令行任务
     */
    @XxlJob("commandJobHandler")
    public void commandJobHandler() throws Exception {
        String command = XxlJobHelper.getJobParam();
        int exitValue = -1;

        BufferedReader bufferedReader = null;
        try {
            // command process
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command(command);
            processBuilder.redirectErrorStream(true);

            Process process = processBuilder.start();
            // 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) {
                XxlJobHelper.log(line);
            }

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

        if (exitValue == 0) {
            // default success
        } else {
            XxlJobHelper.handleFail("command exit value(" + exitValue + ") is failed");
        }
    }
}

使用PowerJob定义任务

public class PowerJobDemoProcessor implements BasicProcessor {
    @Override
    public ProcessResult process(TaskContext taskContext) throws Exception {
        // 在线日志功能,可以直接在控制台查看任务日志,非常便捷
        OmsLogger omsLogger = taskContext.getOmsLogger();
        omsLogger.info("BasicProcessorDemo start to process, current JobParams is {}.", taskContext.getJobParams());

        // TaskContext为任务的上下文信息,包含了在控制台录入的任务元数据,常用字段为
        // jobParams(任务参数,在控制台录入),instanceParams(任务实例参数,通过 OpenAPI 触发的任务实例才可能存在该参数)

        // 进行实际处理...
        // mysteryService.hasaki();

        // 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便
        return new ProcessResult(true, "result is xxx");
    }
}

依赖引入

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

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

    <!-- powerjob -->
    <dependency>
        <groupId>tech.powerjob</groupId>
        <artifactId>powerjob-worker</artifactId>
    </dependency>

    <!--提供服务发现能力-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-commons</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

服务端介绍

xxl-job

请参考xxljob官网。由于服务端需要回调客户端,建议各平台拷贝macula-cloud-xxjob部署到自己的集群中。

PowerJob

请参考PowerJob官网

Macula Task

TODO,未来Macula会提供统一的task服务能力,整合多个常用的定时任务协议。

版权说明

  • Xxljob:https://github.com/xuxueli/xxl-job/blob/master/LICENSE
  • PowerJob:https://github.com/PowerJob/PowerJob/blob/master/LICENSE