目录
前言
xxl-job 是一个分布式任务调度平台,它提供了强大的任务调度和执行能力,可以帮助我们实现任务的自动化调度和执行。本文将介绍如何在 Docker 环境下部署 xxl-job,并将其与 Spring Boot 进行整合。
初始化数据库
数据库脚本:tables_xxl_job-2.4.0.sql
# XXL-JOB v2.4.0# Copyright (c) 2015-present, xuxueli.CREATEdatabaseifNOTEXISTS`xxl_job`defaultcharacterset utf8mb4 collate utf8mb4_unicode_ci;use`xxl_job`;SET NAMES utf8mb4;CREATETABLE`xxl_job_info`(`id`int(11)NOTNULLAUTO_INCREMENT,`job_group`int(11)NOTNULLCOMMENT'执行器主键ID',`job_desc`varchar(255)NOTNULL,`add_time`datetimeDEFAULTNULL,`update_time`datetimeDEFAULTNULL,`author`varchar(64)DEFAULTNULLCOMMENT'作者',`alarm_email`varchar(255)DEFAULTNULLCOMMENT'报警邮件',`schedule_type`varchar(50)NOTNULLDEFAULT'NONE'COMMENT'调度类型',`schedule_conf`varchar(128)DEFAULTNULLCOMMENT'调度配置,值含义取决于调度类型',`misfire_strategy`varchar(50)NOTNULLDEFAULT'DO_NOTHING'COMMENT'调度过期策略',`executor_route_strategy`varchar(50)DEFAULTNULLCOMMENT'执行器路由策略',`executor_handler`varchar(255)DEFAULTNULLCOMMENT'执行器任务handler',`executor_param`varchar(512)DEFAULTNULLCOMMENT'执行器任务参数',`executor_block_strategy`varchar(50)DEFAULTNULLCOMMENT'阻塞处理策略',`executor_timeout`int(11)NOTNULLDEFAULT'0'COMMENT'任务执行超时时间,单位秒',`executor_fail_retry_count`int(11)NOTNULLDEFAULT'0'COMMENT'失败重试次数',`glue_type`varchar(50)NOTNULLCOMMENT'GLUE类型',`glue_source`mediumtextCOMMENT'GLUE源代码',`glue_remark`varchar(128)DEFAULTNULLCOMMENT'GLUE备注',`glue_updatetime`datetimeDEFAULTNULLCOMMENT'GLUE更新时间',`child_jobid`varchar(255)DEFAULTNULLCOMMENT'子任务ID,多个逗号分隔',`trigger_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'调度状态:0-停止,1-运行',`trigger_last_time`bigint(13)NOTNULLDEFAULT'0'COMMENT'上次调度时间',`trigger_next_time`bigint(13)NOTNULLDEFAULT'0'COMMENT'下次调度时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`job_group`int(11)NOTNULLCOMMENT'执行器主键ID',`job_id`int(11)NOTNULLCOMMENT'任务,主键ID',`executor_address`varchar(255)DEFAULTNULLCOMMENT'执行器地址,本次执行的地址',`executor_handler`varchar(255)DEFAULTNULLCOMMENT'执行器任务handler',`executor_param`varchar(512)DEFAULTNULLCOMMENT'执行器任务参数',`executor_sharding_param`varchar(20)DEFAULTNULLCOMMENT'执行器任务分片参数,格式如 1/2',`executor_fail_retry_count`int(11)NOTNULLDEFAULT'0'COMMENT'失败重试次数',`trigger_time`datetimeDEFAULTNULLCOMMENT'调度-时间',`trigger_code`int(11)NOTNULLCOMMENT'调度-结果',`trigger_msg`textCOMMENT'调度-日志',`handle_time`datetimeDEFAULTNULLCOMMENT'执行-时间',`handle_code`int(11)NOTNULLCOMMENT'执行-状态',`handle_msg`textCOMMENT'执行-日志',`alarm_status`tinyint(4)NOTNULLDEFAULT'0'COMMENT'告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',PRIMARYKEY(`id`),KEY`I_trigger_time`(`trigger_time`),KEY`I_handle_code`(`handle_code`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_log_report`(`id`int(11)NOTNULLAUTO_INCREMENT,`trigger_day`datetimeDEFAULTNULLCOMMENT'调度-时间',`running_count`int(11)NOTNULLDEFAULT'0'COMMENT'运行中-日志数量',`suc_count`int(11)NOTNULLDEFAULT'0'COMMENT'执行成功-日志数量',`fail_count`int(11)NOTNULLDEFAULT'0'COMMENT'执行失败-日志数量',`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`),UNIQUEKEY`i_trigger_day`(`trigger_day`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_logglue`(`id`int(11)NOTNULLAUTO_INCREMENT,`job_id`int(11)NOTNULLCOMMENT'任务,主键ID',`glue_type`varchar(50)DEFAULTNULLCOMMENT'GLUE类型',`glue_source`mediumtextCOMMENT'GLUE源代码',`glue_remark`varchar(128)NOTNULLCOMMENT'GLUE备注',`add_time`datetimeDEFAULTNULL,`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_registry`(`id`int(11)NOTNULLAUTO_INCREMENT,`registry_group`varchar(50)NOTNULL,`registry_key`varchar(255)NOTNULL,`registry_value`varchar(255)NOTNULL,`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`),KEY`i_g_k_v`(`registry_group`,`registry_key`,`registry_value`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_group`(`id`int(11)NOTNULLAUTO_INCREMENT,`app_name`varchar(64)NOTNULLCOMMENT'执行器AppName',`title`varchar(12)NOTNULLCOMMENT'执行器名称',`address_type`tinyint(4)NOTNULLDEFAULT'0'COMMENT'执行器地址类型:0=自动注册、1=手动录入',`address_list`textCOMMENT'执行器地址列表,多地址逗号分隔',`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(50)NOTNULLCOMMENT'账号',`password`varchar(50)NOTNULLCOMMENT'密码',`role`tinyint(4)NOTNULLCOMMENT'角色:0-普通用户、1-管理员',`permission`varchar(255)DEFAULTNULLCOMMENT'权限:执行器ID列表,多个逗号分割',PRIMARYKEY(`id`),UNIQUEKEY`i_username`(`username`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;CREATETABLE`xxl_job_lock`(`lock_name`varchar(50)NOTNULLCOMMENT'锁名称',PRIMARYKEY(`lock_name`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;INSERTINTO`xxl_job_group`(`id`,`app_name`,`title`,`address_type`,`address_list`,`update_time`)VALUES(1,'xxl-job-executor-sample','示例执行器',0,NULL,'2018-11-03 22:21:31');INSERTINTO`xxl_job_info`(`id`,`job_group`,`job_desc`,`add_time`,`update_time`,`author`,`alarm_email`,`schedule_type`,`schedule_conf`,`misfire_strategy`,`executor_route_strategy`,`executor_handler`,`executor_param`,`executor_block_strategy`,`executor_timeout`,`executor_fail_retry_count`,`glue_type`,`glue_source`,`glue_remark`,`glue_updatetime`,`child_jobid`)VALUES(1,1,'测试任务1','2018-11-03 22:21:31','2018-11-03 22:21:31','XXL','','CRON','0 0 0 * * ? *','DO_NOTHING','FIRST','demoJobHandler','','SERIAL_EXECUTION',0,0,'BEAN','','GLUE代码初始化','2018-11-03 22:21:31','');INSERTINTO`xxl_job_user`(`id`,`username`,`password`,`role`,`permission`)VALUES(1,'admin','e10adc3949ba59abbe56e057f20f883e',1,NULL);INSERTINTO`xxl_job_lock`(`lock_name`)VALUES('schedule_lock');commit;
Docker 部署 xxl-job
下载镜像
Docker 镜像地址: https://hub.docker.com/r/xuxueli/xxl-job-admin/
# 建议指定版本号docker pull xuxueli/xxl-job-admin:2.4.0
创建容器并运行
创建日志挂载目录
mkdir-p /logs/xxl-job
创建容器并运行
docker run -d--name xxl-job-admin \-ePARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456"\-eJAVA_OPTS="-Xms512M -Xmx512m"\-p8080:8080 \-v /logs/xxl-job:/data/applogs \
xuxueli/xxl-job-admin:2.4.0
访问调度中心
调度中心管控台地址:http://localhost:8080/xxl-job-admin
默认登录账号密码:admin/123456
登录后运行界面如下图所示:
SpringBoot 整合 xxl-job
pom.xml
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version></dependency>
application.yml
# xxl-job 定时任务配置xxl:job:admin:# 多个地址使用,分割addresses: http://127.0.0.1:8080/xxl-job-admin
accessToken: default_token
executor:appname: xxl-job-executor-${spring.application.name}address:ip:port:9999logpath: /data/applogs/xxl-job/jobhandler
logretentiondays:30
XxlJobConfig.java
XXL-JOB 自动装配配置
importcom.xxl.job.core.executor.impl.XxlJobSpringExecutor;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/@Configuration@Slf4jpublicclassXxlJobConfig{@Value("${xxl.job.admin.addresses}")privateString adminAddresses;@Value("${xxl.job.accessToken}")privateString accessToken;@Value("${xxl.job.executor.appname}")privateString appname;@Value("${xxl.job.executor.address}")privateString address;@Value("${xxl.job.executor.ip}")privateString ip;@Value("${xxl.job.executor.port}")privateint port;@Value("${xxl.job.executor.logpath}")privateString logPath;@Value("${xxl.job.executor.logretentiondays}")privateint logRetentionDays;@BeanpublicXxlJobSpringExecutorxxlJobExecutor(){
log.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor =newXxlJobSpringExecutor();
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;}}
执行器注册查看
需要 SpringBoot 应用和调度中心在同一网络,网络不互通则调度器无法调度执行器
启动 SpringBoot 工程 之后,前往调度中心查看执行器注册结果
定时任务测试
添加测试任务
在项目中添加名为
demoJobHandler
的任务处理器(Bean模式)
importcom.xxl.job.core.handler.annotation.XxlJob;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;/**
* xxl-job 测试示例(Bean模式)
*/@Component@Slf4jpublicclassXxlJobSampleHandler{@XxlJob("demoJobHandler")publicvoiddemoJobHandler(){
log.info("XXL-JOB, Hello World.");}}
配置定时任务
调度中心新增测试任务,运行模式为
BEAN
, 任务处理器为
demoJobHandler
配置 Corn 表达式,让其每秒执行一次任务
启动定时任务
测试结果
成功,频率为1s执行一次。
结语
通过本文的实战演示,我们成功地将 xxl-job 部署到 Docker 环境中,并与 Spring Boot 进行了整合。我们了解了 xxl-job 的基本概念和特点,并学习了如何配置调度器任务、开启任务,并调用执行器执行任务。xxl-job 提供了强大的任务调度和执行能力,可以帮助我们实现任务的自动化调度和执行,提高工作效率。希望本文对你理解和使用 xxl-job 有所帮助,欢迎你在实际项目中尝试并应用这些知识。
附录
xxl-job 官方文档
https://www.xuxueli.com/xxl-job/
xxl-job 源码
https://gitee.com/xuxueli0323/xxl-job
测试项目源码
本文涉及的依赖安装、配置和测试用例代码
Gitee: youlai-boot
Github: youlai-boot
版权归原作者 有来技术 所有, 如有侵权,请联系我们删除。