简介
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/