😀
回忆
如果要让一个任务定时执行的话,之前我们用的SpringTask,但是如果数据多了,一个Task就有点乏力,我们一般想法是创建集群,但是Task是串行的,只能执行一个,多个Task也是执行一个流程,不适合分布式执行,所以这里我们就可以用分片任务,用一个任务调度工具来执行片1来查询一半数据,片2执行一般数据,这样就大大优化了查询效率,思想有了,落地方案我们就用XXL—JOB!
XXL-JOB
文档/源码
- 所有的执行器(微服务)需要向任务调度服务注册自己的信息
- 调度中心在定时执行任务的时候,需要传递两个最为重要的参数:当前执行器索引值、执行器总数量
- 执行器根据传递过来的自己的索引值和执行器总数量,来判断那些数据需要处理
- 执行器会把数据源中的数据分片进行处理,提高数据的处理效率
docker安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker pull xuxueli/xxl-job-admin:2.2.0
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'
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
|
@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.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.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; } }
|