XXL-JOB

😀

回忆

如果要让一个任务定时执行的话,之前我们用的SpringTask,但是如果数据多了,一个Task就有点乏力,我们一般想法是创建集群,但是Task是串行的,只能执行一个,多个Task也是执行一个流程,不适合分布式执行,所以这里我们就可以用分片任务,用一个任务调度工具来执行片1来查询一半数据,片2执行一般数据,这样就大大优化了查询效率,思想有了,落地方案我们就用XXL—JOB!

XXL-JOB

文档/源码

  1. 所有的执行器(微服务)需要向任务调度服务注册自己的信息
  2. 调度中心在定时执行任务的时候,需要传递两个最为重要的参数:当前执行器索引值、执行器总数量
  3. 执行器根据传递过来的自己的索引值和执行器总数量,来判断那些数据需要处理
  4. 执行器会把数据源中的数据分片进行处理,提高数据的处理效率

docker安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#1:首先拉取emqx的镜像
docker pull xuxueli/xxl-job-admin:2.2.0

#2:提供了docker-compose.yml,已创建容器
version: "3"
services:
minio:
image: xuxueli/xxl-job-admin:2.2.0
container_name: xxl-job-admin
privileged: true
volumes:
- /opt/middleware/xxljob/applogs:/data/applogs
ports:
- "8080:8080"
environment:
TZ: Asia/Shanghai
PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.200.128:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=root123 --xxl.job.login.username=admin --xxl.job.login.password=123456'


#3: 启动容器
docker start xxl-job-admin

xxl-job项目源码提供了“调度数据库初始化SQL脚本”,xxl-job在容器启动时需要连接数据库, 共8张表

  • xxl_job_lock:任务调度锁表;
  • xxl_job_group:执行器信息表,维护任务执行器信息;
  • xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
  • xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
  • xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
  • xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
  • xxl_job_user:系统用户表;

访问控制台

调度中心访问地址:http://端口号:8080/xxl-job-admin
账号:admin 密码:123456

测试

配置执行器

在任务调度中心,点击进入”执行器管理”界面, 如下图:

属性名称 说明
AppName 是每个执行器集群的唯一标示, 执行器会周期性以AppName为对象进行自动注册。
可通过该配置自动发现注册成功的执行器, 供任务调度时使用;
名称 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性
注册方式 调度中心获取执行器地址的方式;
机器地址 注册方式为”手动录入”时有效,支持人工维护执行器的地址信息;

在调度中心新建任务

在任务管理->新建,填写以下内容

导入官方源码

将资料中的源码解压到开发空间下,通过idea打开,联网进行maven下载jar依赖

修改配置文件

修改简单任务示例

服务一:默认端口:8081,执行器端口:9999

克隆服务二:项目端口:8082,执行器端口:9998

-Dserver.port=8082 -Dxxl.job.executor.port=9998

克隆服务三:项目端口:8803,执行器端口:9997

-Dserver.port=8083 -Dxxl.job.executor.port=9997

三个项目启动后,可以查看到是轮询的方式分别去执行当前调度任务。

Java使用

1:导入依赖

1
2
3
4
5
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>

2:添加配置

1
2
3
4
5
6
7
8
9
10
11
xxl:
job:
accessToken:
admin:
addresses: http://192.168.200.128:8080/xxl-job-admin
executor:
appname: user-service
address:
ip:
port: 9980
logretentiondays: 30 # 执行前日志保存天数,日志文件过期自动删除

3:添加配置类

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
47
48
49
50
51
/**
* xxl-job config
*/
@Configuration
@Slf4j
public class XxlJobConfig {


@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() {
log.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;
}

}

4:添加任务类

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
@Slf4j
public class UserJob {


@XxlJob("JobHandler名字")
public ReturnT<String> workCountInitJobHandler(String param) {
log.info("每日工单量列表初始化");
//逻辑代码~~~

return ReturnT.SUCCESS;
}
}