0


Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录

前言

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

登录后运行界面如下图所示:

xxl-job 调度中心控制台

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 表达式,让其每秒执行一次任务

image-20231101125249482

启动定时任务

image-20231101130441377

测试结果

成功,频率为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


本文转载自: https://blog.csdn.net/u013737132/article/details/134159913
版权归原作者 有来技术 所有, 如有侵权,请联系我们删除。

“Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)”的评论:

还没有评论