xxl-job入门级教程(一)

📅 2026/7/9 2:01:30
xxl-job入门级教程(一)
xxl-job介绍xxl-job介绍xxl-job是一个分布式任务调度平台xxl-job官网地址分布式任务调度平台XXL-JOBxxl-job总体设计调度数据库表说明- xxl_job_lock任务调度锁表 - xxl_job_group执行器信息表维护任务执行器信息 - xxl_job_info调度扩展信息表 用于保存XXL-JOB调度任务的扩展信息如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等 - xxl_job_log调度日志表 用于保存XXL-JOB任务调度的历史信息如调度结果、执行结果、调度入参、调度机器和执行器等等 - xxl_job_log_report调度日志报表用户存储XXL-JOB任务调度日志的报表调度中心报表功能页面会用到 - xxl_job_logglue任务GLUE日志用于保存GLUE更新历史用于支持GLUE的版本回溯功能 - xxl_job_registry执行器注册表维护在线的执行器和调度中心机器地址信息 - xxl_job_user系统用户表设计思想将调度行为抽象形成“调度中心”公共平台而平台自身并不承担业务逻辑“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler交由“执行器”统一管理“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。 因此“调度”和“任务”两部分可以相互解耦提高系统整体稳定性和扩展性。架构图xxl-job-admin部署从 github 上拉取代码GitHub - xuxueli/xxl-job: A distributed task scheduling framework.分布式任务调度平台XXL-JOB · GitHub源码目录介绍- /doc :文档资料 - /db :“调度数据库”建表脚本 - /xxl-job-admin :调度中心项目源码 - /xxl-job-core :公共Jar依赖 - /xxl-job-executor-samples :执行器Sample示例项目大家可以在该项目上进行开发也可以将现有项目改造生成执行器项目安装部署步骤执行“调度数据库”建表脚本# # XXL-JOB v2.4.1-SNAPSHOT # Copyright (c) 2015-present, xuxueli. CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_unicode_ci; use xxl_job; SET NAMES utf8mb4; CREATE TABLE xxl_job_info ( id int(11) NOT NULL AUTO_INCREMENT, job_group int(11) NOT NULL COMMENT 执行器主键ID, job_desc varchar(255) NOT NULL, add_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, author varchar(64) DEFAULT NULL COMMENT 作者, alarm_email varchar(255) DEFAULT NULL COMMENT 报警邮件, schedule_type varchar(50) NOT NULL DEFAULT NONE COMMENT 调度类型, schedule_conf varchar(128) DEFAULT NULL COMMENT 调度配置值含义取决于调度类型, misfire_strategy varchar(50) NOT NULL DEFAULT DO_NOTHING COMMENT 调度过期策略, executor_route_strategy varchar(50) DEFAULT NULL COMMENT 执行器路由策略, executor_handler varchar(255) DEFAULT NULL COMMENT 执行器任务handler, executor_param varchar(512) DEFAULT NULL COMMENT 执行器任务参数, executor_block_strategy varchar(50) DEFAULT NULL COMMENT 阻塞处理策略, executor_timeout int(11) NOT NULL DEFAULT 0 COMMENT 任务执行超时时间单位秒, executor_fail_retry_count int(11) NOT NULL DEFAULT 0 COMMENT 失败重试次数, glue_type varchar(50) NOT NULL COMMENT GLUE类型, glue_source mediumtext COMMENT GLUE源代码, glue_remark varchar(128) DEFAULT NULL COMMENT GLUE备注, glue_updatetime datetime DEFAULT NULL COMMENT GLUE更新时间, child_jobid varchar(255) DEFAULT NULL COMMENT 子任务ID多个逗号分隔, trigger_status tinyint(4) NOT NULL DEFAULT 0 COMMENT 调度状态0-停止1-运行, trigger_last_time bigint(13) NOT NULL DEFAULT 0 COMMENT 上次调度时间, trigger_next_time bigint(13) NOT NULL DEFAULT 0 COMMENT 下次调度时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_log ( id bigint(20) NOT NULL AUTO_INCREMENT, job_group int(11) NOT NULL COMMENT 执行器主键ID, job_id int(11) NOT NULL COMMENT 任务主键ID, executor_address varchar(255) DEFAULT NULL COMMENT 执行器地址本次执行的地址, executor_handler varchar(255) DEFAULT NULL COMMENT 执行器任务handler, executor_param varchar(512) DEFAULT NULL COMMENT 执行器任务参数, executor_sharding_param varchar(20) DEFAULT NULL COMMENT 执行器任务分片参数格式如 1/2, executor_fail_retry_count int(11) NOT NULL DEFAULT 0 COMMENT 失败重试次数, trigger_time datetime DEFAULT NULL COMMENT 调度-时间, trigger_code int(11) NOT NULL COMMENT 调度-结果, trigger_msg text COMMENT 调度-日志, handle_time datetime DEFAULT NULL COMMENT 执行-时间, handle_code int(11) NOT NULL COMMENT 执行-状态, handle_msg text COMMENT 执行-日志, alarm_status tinyint(4) NOT NULL DEFAULT 0 COMMENT 告警状态0-默认、1-无需告警、2-告警成功、3-告警失败, PRIMARY KEY (id), KEY I_trigger_time (trigger_time), KEY I_handle_code (handle_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_log_report ( id int(11) NOT NULL AUTO_INCREMENT, trigger_day datetime DEFAULT NULL COMMENT 调度-时间, running_count int(11) NOT NULL DEFAULT 0 COMMENT 运行中-日志数量, suc_count int(11) NOT NULL DEFAULT 0 COMMENT 执行成功-日志数量, fail_count int(11) NOT NULL DEFAULT 0 COMMENT 执行失败-日志数量, update_time datetime DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY i_trigger_day (trigger_day) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_logglue ( id int(11) NOT NULL AUTO_INCREMENT, job_id int(11) NOT NULL COMMENT 任务主键ID, glue_type varchar(50) DEFAULT NULL COMMENT GLUE类型, glue_source mediumtext COMMENT GLUE源代码, glue_remark varchar(128) NOT NULL COMMENT GLUE备注, add_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_registry ( id int(11) NOT NULL AUTO_INCREMENT, registry_group varchar(50) NOT NULL, registry_key varchar(255) NOT NULL, registry_value varchar(255) NOT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY i_g_k_v (registry_group,registry_key,registry_value) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_group ( id int(11) NOT NULL AUTO_INCREMENT, app_name varchar(64) NOT NULL COMMENT 执行器AppName, title varchar(12) NOT NULL COMMENT 执行器名称, address_type tinyint(4) NOT NULL DEFAULT 0 COMMENT 执行器地址类型0自动注册、1手动录入, address_list text COMMENT 执行器地址列表多地址逗号分隔, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 账号, password varchar(50) NOT NULL COMMENT 密码, role tinyint(4) NOT NULL COMMENT 角色0-普通用户、1-管理员, permission varchar(255) DEFAULT NULL COMMENT 权限执行器ID列表多个逗号分割, PRIMARY KEY (id), UNIQUE KEY i_username (username) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE xxl_job_lock ( lock_name varchar(50) NOT NULL COMMENT 锁名称, PRIMARY KEY (lock_name) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO 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 ); INSERT INTO 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, ); INSERT INTO xxl_job_user(id, username, password, role, permission) VALUES (1, admin, e10adc3949ba59abbe56e057f20f883e, 1, NULL); INSERT INTO xxl_job_lock ( lock_name) VALUES ( schedule_lock); commit;修改 xxl-job-admin 目录配置文件 application.properties### xxl-job, datasource spring.datasource.urljdbc:mysql://127.0.0.1:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password123456 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver ### xxl-job配置客户端接入配置token xxl.job.accessTokenit-demo日志配置文件 logback.xml构建编译mvn install启动构建完的jar访问地址ip:8080/xxl-job-admin默认账号密码admin/123456xxl-job UI界面介绍任务管理模块路由策略第一个选择第一个机器最后一个选择最后一个机器轮询依次选择执行随机随机选择在线的机器一致性HASH每个任务按照Hash算法固定选择某一台机器并且所有的任务均匀散列在不同的机器上最不经常使用使用频率最低的机器优先被使用最近最久未使用最久未使用的机器优先被选举故障转移按照顺序依次进行心跳检测第一个心跳检测成功的机器选定为目标的执行器并且会发起任务调度忙碌转移按照顺序来依次进行空闲检测第一个空闲检测成功的机器会被选定为目标群机器并且会发起任务调度分片广播广播触发对于集群中的所有机器执行任务同时会系统会自动传递分片的参数调度过期策略调度中心错过调度时间的补偿处理策略包括忽略、立即补偿触发一次阻塞处理策略单机串行新的调度任务在进入到执行器之后该调度任务进入FIFO队列并以串行的方式去进行丢弃后续调度新的调度任务在进入到执行器之后如果存在相同的且正在运行的调度任务本次的调度任务请求就会被丢弃掉并且标记为失败覆盖之前的调度新的调度任务在进入到执行器之后如果存在相同的且正在运行的调度任务就会终止掉当前正在运行的调度任务并且清空队列运行新的调度任务。子任务ID输入子任务的任务id可填写多个任务超时时间添加任务超时的时候单位s设置时间大于0的时候就会生效失败重试次数设置失败重试的次数设置时间大于0的时候就会生效负责人填写该任务调度的负责人调度日志模块这里是查看调度的日志根据日志来查看任务具体的执行情况是怎样的执行器管理模块这里是配置执行器等待执行器启动的时候都会被调度中心监听加入到地址列表用户管理模块可以对用户的一些操作springboot整合xxl-jobspringboot 整合 xxl-job 可以参考源码中的 xxl-job-executor-samples整合步骤添加 xxl-job 的 maven 依赖dependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.4.0/version /dependency在 resource 目录新增 logback.xml 日志配置文件?xml version1.0 encodingUTF-8? configuration debugfalse scantrue scanPeriod1 seconds contextNamelogback/contextName property namelog.path valueD:/data/applogs/xxl-job/xxl-job-executor-springboot.log/ appender nameconsole classch.qos.logback.core.ConsoleAppender encoder pattern%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender appender namefile classch.qos.logback.core.rolling.RollingFileAppender file${log.path}/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${log.path}.%d{yyyy-MM-dd}.zip/fileNamePattern /rollingPolicy encoder pattern%date %level [%thread] %logger{36} [%file : %line] %msg%n /pattern /encoder /appender root levelinfo appender-ref refconsole/ appender-ref reffile/ /root /configuration在 resource 目录新增 application.properties 配置文件# web port server.port8089 # no web #spring.main.web-environmentfalse # log config logging.configclasspath:logback.xml ### xxl-job admin address list, such as http://address or http://address01,http://address02 xxl.job.admin.addresseshttp://127.0.0.1:8080/xxl-job-admin ### xxl-job, access token xxl.job.accessTokendefault_token ### xxl-job executor appname xxl.job.executor.appnamexxl-job-executor-demo ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null xxl.job.executor.address ### xxl-job executor server-info xxl.job.executor.ip xxl.job.executor.port9999 ### xxl-job executor log-path xxl.job.executor.logpathD:/data/applogs/xxl-job/jobhandler ### xxl-job executor log-retention-days xxl.job.executor.logretentiondays30添加 xxl-job 配置类import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class XxlJobConfig { private 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; } }编写一个分布式调度任务类import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; Component Slf4j public class MyJobHandler { public void init() { log.info( MyJobHandler init.); } public void destroy() { log.info( MyJobHandler destroy.); } XxlJob(value testJobHandler, init init, destroy destroy) public void testJobHandler() { log.info(testJobHandler 调度任务触发了.); // 获取UI界面传递过来的参数 String jobParam XxlJobHelper.getJobParam(); log.info(jobParam: jobParam); } }启动调度任务的springboot在 xxl-job-admin 的UI界面上配置在【执行器管理】新增执行器 xxl-job-executor-demo这个执行器名称就是 application.properties 配置的注册方式调度中心获取执行器地址的方式自动注册执行器自动进行执行器的注册通过底层的注册表可以动态的发现执行器机器的地址手动录入人工手动录入执行器的地址信息多地址使用逗号进行分割供调度中心使用在【任务管理】新增一个调度任务配置完成后在【任务管理】界面可以执行一次或启动调度任务点击执行一次调度任务的springboot控制台输出