XXL-JOB

xxl-job是一个分布式任务调度平台。

快速开始

xxl-job采用控制面和数据面分离的架构。xxl-job-adminxxl-job的调度中心,负责管理执行器和任务、同时负责任务调度。
xxl-job-admin可以利用官方提供源码已经打包部署或者使用Docker官方的镜像进行部署。这里并不进行介绍。下面主要介绍执行器的安装配置以及使用方法。

安装与配置

  1. 添加Maven依赖
1
2
3
4
5
6
7

<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<!-- 这里最好跟调度中心部署的版本一致 -->
<version>${最新稳定版本}</version>
</dependency>
  1. 增加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
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
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”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.accessToken: 是访问调度中心的有效凭证。这个值在调度中心部署的时候进行设置的话,那么执行器也要设置成一样的值。如果调度中心没有设置的话,则可以设置为空。
  • xxl.job.executor.appname: 是执行器的名称。如果为空会关闭自动注册。
  • xxl.job.executor.address: 是执行器在调度中心注册的回调地址。与下面的ip和port配置冲突。
  • xxl.job.executor.ip: 是执行器在调度中心注册的回调地址ip
  • xxl.job.executor.port: 是执行器在调度中心注册的回调地址端口

xxl.job.executor.address和xxl.job.executor.ip需要配置成调度中心能够访问的IP。否则调度中心无法回调触发任务执行。

  1. 配置相关启动类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

@Configuration
public class XxlJobConfig {

private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

@Value("${xxl.job.admin.addresses}")
private String adminAddresses;

@Value("${xxl.job.accessToken}")
private String accessToken;

@Value("${xxl.job.executor.appname}")
private String appname;

@Value("${xxl.job.executor.address}")
private String address;

@Value("${xxl.job.executor.ip}")
private String ip;

@Value("${xxl.job.executor.port}")
private int port;

@Value("${xxl.job.executor.logpath}")
private String logPath;

@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;


@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}

使用

XXL-JOB提供了丰富的使用模式。下面主要介绍基于Bean模式的类形式和方法形式。其他模式可以参考官网的说明。

1. 类形式

类形式任务类需要继承com.xxl.job.core.handler.IJobHandler,业务逻辑通过重写的execute方法实现。同时,需要通过下述代码进行配置。

1
XxlJobExecutor.registJobHandler("demoJobHandler",new DemoJobHandler());

推荐使用Spring的InitializingBeanafterPropertiesSet回调方法中进行注册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class XxlJobBeanDemoHandler extends IJobHandler implements InitializingBean {


@Override
public void execute() throws Exception {
XxlJobHelper.log("XXL-JOB, Bean Mode Hello World.");
}

@Override
public void afterPropertiesSet() throws Exception {
// 向XxlJob执行器注册自己
// Bean 模式的 类形式需要自己手动注册。
XxlJobExecutor.registJobHandler("xxlJobBeanDemoHandler", this);
}
}

2. 方法形式

方法形式则需要继承任何类,同时一个类可以有多个方法是任务处理器。
只需要在对应方法上,加上@XxlJob注解即可。

1
2
3
4
5
6
7
8
9
@Component
public class XxlJobBeanShardDemoHandler {

@XxlJob("helloWorldBeanShardJobHandler")
public void execute() throws Exception {
XxlJobHelper.log("XXL-JOB, Bean Mode Hello World.");
}
}

参考文档