简介

XXL-JOB是一个中心化的任务调度引擎,由各个执行器启动时主动向调度中心进行任务注册,任务的参数由@XxlJobTask进行描述,而@XxlJob是一个任务标识,设置了JobHandler名称,由于调度中心在执行任务时通过RPC调用任务的具体逻辑。以下示例非常简单演示了引入使用的过程。

注意:调度任务不带token,所以无法在task代码中获取用户相关信息
注意:调度任务不带token,所以无法在task代码中获取用户相关信息
注意:调度任务不带token,所以无法在task代码中获取用户相关信息

操作示例

1. pom.xml引入依赖

<dependency>
    <groupId>cn.flyrise</groupId>
    <artifactId>pai-common-job</artifactId>
</dependency>

2. 启用执行器配置

@EnablePaiJobExecutor 用于启用执行器配置。

@SpringBootApplication
@EnablePaiJobExecutor
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

}

3. 编写任务逻辑

特别提醒:由于实现核心是借用Spring的扫描能力,需要对上下文中的实现进行方法扫描,所以@Component 不能少了。


@Component
public class TestJob {

    @XxlJob("test1")
    @XxlJobTask(desc = "测试任务1,1分钟执行一次", cron = "0 0/1 * * * ?", author = "Joe")
    public ReturnT<String> test1(String param) {
        System.out.println("test1 >>> no param");
        return ReturnT.SUCCESS;
    }

    @XxlJob("test2")
    @XxlJobTask(desc = "测试任务2,5分钟执行一次", cron = "0 0/5 * * * ?", author = "Joe", param = "{\"name\":\"David\"}", childs = "test1")
    public ReturnT<String> test2(String param) {
        System.out.println("test2 >>>" + param);
        return ReturnT.SUCCESS;
    }

    @XxlJob("test3")
    @XxlJobTask(desc = "测试任务3,5分钟执行一次", cron = "0 0/5 * * * ?", author = "Joe", param = "{\"name\":\"David\"}", childs = {"test1", "test2"})
    public ReturnT<String> test3(String param) {
        System.out.println("test3 >>>" + param);
        return ReturnT.SUCCESS;
    }
}

自 1.8.1 、1.8.1-RC1 版起 desc、cron、author 支持Spring规范的表达式,可把cron作为Nacos配置参数外置,方便灵活配置

    <dependency>
        <groupId>cn.flyrise</groupId>
        <artifactId>pai-common-job</artifactId>
        <version>1.8.1</version>
    </dependency>
    @XxlJob("test4")
    @XxlJobTask(desc = "测试任务4,动态参数", cron = "${xxl.job.cron}", author = "Joe", param = "{\"name\":\"David\"}", childs = {"test1", "test2"})
    public ReturnT<String> test3(String param) {
        System.out.println("test3 >>>" + param);
        return ReturnT.SUCCESS;
    }

4. 增加xxl-job config

执行器配置,配置内容说明:

### 定时任务开关,建议本地开发既dev环境设置为fasle,否则可能会冲突,导致部署到pai环境的执行不到任务
xxl.job.enable=true
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册""任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器标题 [选填]:执行器名称(对AppName的描述, 中英)
xxl.job.executor.title=示例
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册""调度中心请求并触发任务"
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30

xxl.job.executor.appname: 一般为工程名称, 建议与spring.application.name一致
xxl.job.executor.title: 执行器名称(对AppName的描述, 中英)
xxl.job.admin.addresses 取共享配置

Nacos配置(建议)

xxl:
  job:
    executor:
      appname: '<必填>' #工程名,不要超过30个字符 尽量简短
      title: '<必填>'  # 标题,不要超过12个字符 尽量简短

5. 修改Dockerfile

EXPOSE 增加9999端口

EXPOSE 8080 9999

6. 本地调试

本地仅支持注册执行器和任务(addresses需配成域名)
注册的注解使用只要按规范使用就一定会注册上去,可以看日志有没有提示注册成功

c.f.job.config.JobHandlerRegistrar       : >>>>>>>>>>> 执行器pai-XXXX注册成功,共发现n个任务

本地测试方式1:使用junit
本地测试方式2:自定义一个Controller去调用, 并配置免鉴权白名单,因为调度器是不具备获取用户信息的
本地测试方式3:配置启动一个xxl-job-admin服务,并配置xxl.job.admin.addresses,手动添加执行器和任务

参考资料

官方文档:https://www.xuxueli.com/xxl-job/

文档更新时间: 2024-06-18 10:47   作者:伍润源