首页/新闻资讯/正文详情

Docker部署XXL-JOB:从调度中心到执行器的完整实战指南

发布时间:2026/9/24 6:38:32 来源:云帆数科 栏目:资讯中心
Docker部署XXL-JOB:从调度中心到执行器的完整实战指南
1. 为什么用 Docker 部署 XXL-JOB先搞清楚它到底解决什么问题先聊点实在的。很多团队的业务系统里都有定时任务比如每天早上给用户推送报表、凌晨清理过期数据、整点拉取对账单。早期大家习惯直接在应用服务里写个Scheduled注解或者扔到服务器 crontab 里任务少的时候确实够用。但一旦任务量上来问题就冒出来了同一套代码在多台机器上部署定时任务被重复执行任务跑挂了没有告警业务方第二天才发现想统计一下今天所有任务的成功率只能去日志里翻。这些都是典型的分布式任务调度痛点。XXL-JOB 这个项目说白了就是把你手里这些分散的定时任务集中到一个平台上统一管起来。它由两个角色组成调度中心xxl-job-admin和_执行器_xxl-job-executor。调度中心负责任务的注册、触发、调度、日志管理执行器负责真正跑业务逻辑。这种调度和执行分离的设计天然就支持分布式——你有多台应用服务器就在每台上都挂一个执行器调度中心通过注册中心发现它们然后按路由策略把任务分发下去。那为什么非要用 Docker 部署直接下个 jar 包跑不行吗当然行但我不建议你在生产环境直接裸跑。XXL-JOB 调度中心本身依赖 MySQL它自己要有个数据库存任务配置和执行记录。如果你手装要配 Java 环境、配 MySQL 连接、写 systemd 服务脚本升级版本还得手动替换 jar 包。用 Docker 之后调度中心连同它依赖的 MySQL一次编排搞定三分钟就能从零拉起一个能用的环境。后续要换版本改个镜像标签重新docker compose up -d就行。有一点要提前说清楚XXL-JOB 的调度中心是 Java 写的它打包好的镜像大多基于官方源码构建所以如果你们公司有内网安全要求不能直接拉外网镜像可以考虑自己构建镜像推到内网仓库。这个流程我在后面的实操部分也会带一下。另外提醒一句Docker 部署调度中心很简单但是执行器接入才是实际使用中花时间最多的地方。你可以纯手工把执行器 jar 包丢到已有服务里也可以用官方提供的xxl-job-executor-sample-springboot快速生成一个执行器样例。我后面会分别讲这两种方式你根据自己的实际情况选。2. 部署前奏镜像选型、版本选择和数据库准备2.1 镜像到底选哪个别用 latest最好自己构建项目地址里有官方镜像常见的有两个xuxueli/xxl-job-admin这是调度中心的官方镜像。xuxueli/xxl-job-executor-sample-springboot官方提供的执行器示例镜像。实际操作中我强烈建议不要直接用 latest 标签。最新版可能引入一些调整而且后续升级时你也不知道改动有多大。比如 XXL-JOB 2.4.1 的镜像在部分环境下就有性能问题升级前要对照官方 release notes。正确的做法是选定一个稳定版本比如 2.3.1、2.4.0。确认版本后可以把这个版本对应的调度中心镜像 tag 固定下来。如果你的环境不能直接访问镜像仓库那就自己构建。构建方式很简单去 GitHub 把xxl-job源码 clone 下来切到你想要的 tag然后构建调度中心模块的镜像。官方源码里xxl-job-admin目录下是有 Dockerfile 的自己构建的好处是顺便可以把数据库初始化脚本打进去或者替换一些自定义配置。2.2 数据库准备MySQL 和 PostgreSQL 我分别讲一下XXL-JOB 官方默认支持 MySQL但社区里也有人把数据层适配到 PostgreSQL。如果你团队里 PostgreSQL 比较多不想为这个项目单独起一个 MySQL 实例那下面这个适配过程就值得看。先说 MySQL 方案这个最稳。直接用 docker compose 起一个 MySQL 5.7 或 8.0 容器然后执行官方提供的tables_xxl_job.sql建表脚本就行。官方对 MySQL 版本要求不高5.7 和 8.0 实测都能跑。需要注意字符集建议指定utf8mb4避免以后任务描述里出现 emoji 导致乱码。再聊 PostgreSQL 适配。XXL-JOB 使用的 MyBatis 框架SQL 多集中在XxlJobLogDao、XxlJobInfoDao等 XML 文件中。要适配 PostgreSQL核心是改两点一是 SQL 方言比如 MySQL 的limit用法、replace into、date_add等函数在 PostgreSQL 里都需要换成对应写法二是数据类型比如datetime换timestampTINYINT用SMALLINT。社区有人提过 MR直接把xxl-job-admin里的 mapper XML 替换成 PostgreSQL 版本再改一下application.properties里的数据源配置是可以跑通的。不过我不太建议在核心生产环境用这种非官方适配因为后续 XXL-JOB 升级时官方 MySQL 版本的 SQL 变更需要你自己同步到 PG 方言维护成本会持续存在。如果只是测试或者内部工具那无所谓。如果不想改源码还有个偷懒的办法把 XXL-JOB 的调度数据放到 MySQL业务数据留在 PostgreSQL。反正调度中心不碰你的业务表数据跨库没问题只是部署上多维护一个 MySQL 而已。我个人更倾向这种方案因为官方支持路径最稳。2.3 Docker 环境检查与常见启动失败部署前先确认你本机 Docker 能正常用。Windows 用户经常遇到的问题就是 Docker Desktop 启动失败提示virtualization support not detected。这个错通常是 BIOS 里虚拟化没开或者 Windows 的 Hyper-V 功能没启用。排查路径很简单打开任务管理器 - 性能 - CPU看右下角虚拟化是否显示已启用。如果是已禁用重启进 BIOS找到 Intel Virtualization Technology 或 AMD SVM Mode开启后保存退出。如果虚拟化已经开启去启用或关闭 Windows 功能里确认 Hyper-V 和适用于 Linux 的 Windows 子系统都勾上了重启后再试。Docker Desktop 启动时还会依赖 Windows 的虚拟机监控程序有时候第三方杀毒软件会拦截把它加入白名单再试。Linux 服务器上部署就少这类问题只要内核版本和 Docker 版本不冲突就行。Docker 20.10 以上一般都能正常跑。部署时候还会遇到端口占用。XXL-JOB 调度中心默认端口是 8080如果本机 8080 被其他服务占了记得在 compose 文件里改映射。我这边实际部署用的 docker-compose 配置如下你参考这个基础后续可以按需改参数version: 3.8 services: mysql: image: mysql:5.7 container_name: xxl-job-mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: xxl_job MYSQL_USER: xxl MYSQL_PASSWORD: xxl123456 ports: - 3306:3306 volumes: - ./mysql-data:/var/lib/mysql - ./sql/tables_xxl_job.sql:/docker-entrypoint-initdb.d/tables_xxl_job.sql command: --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci restart: always xxl-job-admin: image: xuxueli/xxl-job-admin:2.4.0 container_name: xxl-job-admin environment: PARAMS: --spring.datasource.urljdbc:mysql://mysql:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue --spring.datasource.usernamexxl --spring.datasource.passwordxxl123456 ports: - 8080:8080 volumes: - ./logs:/data/applogs depends_on: - mysql restart: always注意PARAMS环境变量是官方镜像预留的启动参数入口。调度中心里的application.properties默认端口是 8080容器内的应用端口不用改只改宿主机映射端口就行。2.4 调度中心账号初始化新部署的调度中心默认会创建一个管理员账户登录后第一件事就是改密码。官方账号我提醒一下部署完别直接用默认密码裸奔尤其是云服务器上改掉再让团队成员使用。登录之后进系统管理 - 用户管理新建账号给不同团队用别让所有人共用 admin。3. 实操从零到一用 Docker Compose 拉起调度中心3.1 一次性初始化数据库表数据库表结构在官方源码的doc/db/tables_xxl_job.sql。如果你用的是 docker-compose 里的 MySQL 容器初始化方式把 SQL 文件挂载到/docker-entrypoint-initdb.d/目录下MySQL 容器首次启动时会自动执行。这个方法适合干净环境。如果你的 MySQL 是自己已有的比如公司已经有个公共数据库实例那就可以手动导入mysql -h127.0.0.1 -uroot -p tables_xxl_job.sql建表成功后会生成 8 张表主要包括xxl_job_info任务信息、xxl_job_log调度日志、xxl_job_registry执行器注册表、xxl_job_group执行器分组等。我见过有人只导入了一半表就启动调度中心结果页面能开但一点任务管理就报错。这里提醒一下导入过程不要中断最后确认一下表数量。如果xxl_job_user表里没有初始数据登录页面会报用户名或密码错误初始化脚本里默认会插入 admin 账号密码是 123456别改掉脚本里的初始数据否则首次登录会卡住。3.2 启动调度中心并验证在 compose 文件所在目录执行docker compose up -d启动后等几秒看两个容器状态docker compose ps如果xxl-job-admin一直重启多半是数据库连不上。先看日志docker logs xxl-job-admin --tail 50看到Started XxlJobAdminApplication基本就成功。浏览器访问http://localhost:8080/xxl-job-admin用 admin 账号登录进去首页能看到任务调度数量、执行器数量这些粗略信息说明调度中心已经是活的了。实操心得我这里用docker compose而不是docker run直接跑是因为调度中心本身依赖数据库用 compose 能把 MySQL 和 admin 一次编排起来别人接手也方便。depends_on只能保证容器启动顺序不能保证 MySQL 初始化完成所以首次启动时 admin 容器可能会因为连不上库而退出几次后面 MySQL 就绪后 compose 的restart: always会自动拉起它不用慌。3.3 关于容器的时区问题很多人部署完发现任务日志时间对不上比实际时间晚了 8 小时。这是因为官方的 admin 镜像默认时区有可能是 UTC。解决方式是在 compose 里给 admin 容器设置时区环境变量environment: - TZAsia/Shanghai同时连接数据库的 URL 里要带serverTimezoneAsia/Shanghai这个参数在前面给的PARAMS里已经写上了。两处都设置好日志时间和任务触发时间才会和本地一致。4. 执行器接入让业务服务真正跑起来4.1 手工接入执行器依赖调度中心准备好了业务系统想变成执行器最快的方式是引入官方 starter 依赖。以 Maven 项目为例在pom.xml里加上dependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.4.0/version /dependency然后写一个 XxlJobConfig 配置类注册执行器 BeanConfiguration 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.port}) private int port; Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor executor new XxlJobSpringExecutor(); executor.setAdminAddresses(adminAddresses); executor.setAccessToken(accessToken); executor.setAppname(appname); executor.setAddress(http://localhost: port); executor.setPort(port); return executor; } }配置文件里加上xxl.job.admin.addresseshttp://localhost:8080/xxl-job-admin xxl.job.accessTokendefault_token xxl.job.executor.appnamemy-app-executor xxl.job.executor.port9999注意accessToken要跟调度中心里配置的一致否则执行器注册不上执行任务会报xxl-job access token is invalid。调度中心默认的 accessToken 在哪里看登录后进入系统管理 - 系统配置里面有个AccessToken默认是default_token如果你改了两边要同步。executor.port是执行器跟调度中心通信的一个 HTTP 端口随便选个没被占用的端口就行。这个端口不要跟业务服务端口混在一起它是执行器自己启动的一个 Netty HTTP 服务专门接收调度中心的调度请求。4.2 在调度中心新增执行器和任务执行器服务启动起来之后登录调度中心后台。先到执行器管理页面点新增执行器AppName填配置里面的my-app-executor名称随意注册方式选自动注册。保存后稍等一下执行器列表里就能看到注册过来的机器显示的是 IP 和端口。再到任务管理页面点新增任务填写任务描述、调度类型一般选 Cron、Cron 表达式。比如每天凌晨 2 点跑一次Cron 就写0 0 2 * * ?。JobHandler 这一项是关键它对应你代码里XxlJob注解的 value。在业务代码中加一个定时方法Component public class DemoJob { XxlJob(demoJobHandler) public void demoJobHandler() throws Exception { System.out.println(执行定时任务当前时间 new Date()); } }JobHandler 填demoJobHandler执行器选my-app-executor然后保存。回到列表点击执行一次日志里能看到执行成功。再到调度日志里查看完整调用链有执行结果和时间消耗。实操心得新手最容易在 JobHandler 上踩坑代码里XxlJob的值跟后台填的 JobHandler 不一致导致执行时报job handler not found。这个错误信息很常见排查的时候直接去代码里搜注解值跟后台比对就行。4.3 用容器方式部署执行器的注意事项如果你打算把执行器也容器化有几个坑要注意。第一执行器的网络模式。调度中心要能访问到执行器的端口如果两个容器在同一个 docker 网络里执行器的address要填容器的服务名不要填 localhost。比如执行器容器名叫my-executor调度中心里自动注册拿到的 IP 如果是 172.x 开头的内网 IP调度中心可以访问到但如果你在本机浏览器访问可能不通。这种情况下可以在执行器配置里手动指定xxl.job.executor.address为宿主机 IP 加映射端口或者让两个容器都走 host 网络模式。生产环境我见过最省心的就是执行器不容器化直接用宿主机进程跑避免容器 IP 变化导致调度失败。第二任务日志挂载。执行器的日志默认写到应用目录下的logs/xxl-job/容器化部署时一定要用 volume 挂载出来否则任务跑一段时间容器重启日志全丢排查问题无从下手。volumes: - ./executor-logs:/app/logs第三内存限制。启动执行器时给进程预留足够的内存JVM 参数-Xms256m -Xmx512m这种别让容器因为内存不足被内核杀掉。任务逻辑如果特别重堆内存可以放宽。5. 新增任务与路由策略的实战配置5.1 路由策略怎么选调度中心在配置任务时路由策略是个重要选项。默认是第一个意思是每次调度都发给注册列表里的第一台机器。如果只有一台执行器哪种策略都无所谓但多台执行器时就要想清楚了。简单说说几个常用策略的区别轮询每次调度按顺序发给不同机器适合无状态任务。故障转移如果一台机器失败自动发到下一台适合对成功率有要求的任务。分片广播所有机器同时执行但通过参数区分各自处理的业务范围适合大批量数据拆分的场景。实际用得最多的是轮询和分片广播。比如你要处理 100 万条历史数据单台机器跑 2 小时用分片广播后每台机器只处理一部分速度成倍提升。分片广播模式里执行器会拿到jobParam和shardIndex、shardTotal在代码里取这两个值做数据切分。5.2 任务参数传递任务需要入参时可以在后台配置任务时填任务参数这个参数会以String形式传给执行器。代码里处理方式XxlJob(paramJobHandler) public void paramJobHandler() throws Exception { String param XxlJobHelper.getJobParam(); // 解析 param比如按逗号拆分 String[] parts param.split(,); // 业务逻辑 }任务参数适合放一些业务标识、批次号之类的简单值。如果你的参数特别复杂建议别塞在任务参数里而是让执行器去数据库或配置中心读取避免后台维护大段 JSON。5.3 任务阻塞处理任务阻塞策略也很关键理解成上一个任务还没跑完下一个调度时间到了怎么办。默认是单机串行下一个等上一个跑完再执行适合大多数场景。如果是丢弃后续调度那延迟比较高的任务可以选择这个避免堆积。如果是覆盖之前调度可以强行终止前一个任务但如果任务在跑数据库事务强行终止可能造成事务悬挂不建议常用。任务设置界面还有个超时时间设置后如果任务执行超过这个时间调度中心会认为失败并记录。但它不是强制 kill 任务只是标记失败。真正要想 kill 运行中的任务需要后台点终止按钮或者配置了执行器的端口后通过接口终止。5.4 执行日志的配置执行日志很重要排查问题全靠它。代码里尽量多写XxlJobHelper.log(处理到第{}条, i)这个日志会同步到调度中心的日志详情页面不用再跑到业务服务器上看文件。特别是跨部门协作时运维不会给业务开发开服务器权限调度中心的日志页面就是唯一入口把关键日志打上去能省不少事。6. 常见问题与排查技巧实录6.1 问题速查表我在多次部署和答疑过程中整理了一张问题速查表基本都是高频问题建议收藏现象排查方向解决方案调度中心启动后一直重启数据库连不上看 admin 容器日志确认数据库地址、账号密码、表结构是否初始化执行器管理里没有机器注册accessToken 不一致端口不通校验执行器配置里的 token 与后台系统配置是否一致从调度中心容器 telnet 执行器端口执行任务报job handler not found注解 value 和后台配置不一致搜索代码里 XxlJob 注解的 value跟后台 JobHandler 比对任务执行了但日志里看不到记录执行器日志丢失检查执行器日志文件确认 volume 挂载是否生效调度日志一直显示运行中执行器回调失败看调度中心日志检查执行器地址是否可达任务触发时间与本地差 8 小时时区问题给容器设置 TZAsia/ShanghaiJDBC URL 加 serverTimezoneAsia/ShanghaiMySQL 连接报Public Key Retrieval is not allowedMySQL 8.0 的问题JDBC URL 加allowPublicKeyRetrievaltrueDocker Desktop 启动报 virtualization 错误虚拟化没开或 Hyper-V 被禁任务管理器查看虚拟化状态BIOS 开启 VT-x/AMD-V启用 Hyper-V 功能6.2 案例xxl-job 适配 PostgreSQL 时遇到的坑我有个客户环境没有现成的 MySQLDBA 只给了一个 PostgreSQL 实例。当时试了一下社区方案过程不复杂但有几个细节要注意。一是 MyBatis 的useGeneratedKeys用法。XXL-JOB 的XxlJobInfoDao在 insert 后要回拿主键 IDMySQL 里通过useGeneratedKeystrue keyPropertyid做PostgreSQL 里需要改 SQL 显式返回主键比如INSERT ... RETURNING id。二是分页语法。XXL-JOB 的任务列表查询用的是 MySQL 的LIMIT offset, sizePostgreSQL 要改成LIMIT size OFFSET offset。如果漏改翻页功能就会异常或直接报 SQL 语法错误。三是定时表达式存储。XXL-JOB 的调度是内部维护了一个时间轮和底层数据库没太大关系所以 SQL 适配对调度本身影响不大。但日志表xxl_job_log的清理 SQL 里有DELETE FROM xxl_job_log WHERE trigger_time DATE_SUB(NOW(), INTERVAL 7 DAY)这种 MySQL 函数要替换成 PostgreSQL 的NOW() - INTERVAL 7 days。所以你要是真要适配建议把 XML 里的 SQL 全部过一遍不能只改连接配置就完事。6.3 案例执行器容器化后调度失败之前帮一个项目排查问题执行器放在容器里调度中心在另一台服务器上。任务列表里添加任务后手动触发日志一直显示调度失败。排查过程是先在调度中心所在服务器上用 curl 测一下执行器端口发现不通。接着 docker inspect 看了执行器容器的网络发现 Compose 默认创建了 bridge 网络容器 IP 是 172.18.0.x。调度中心如果也在同一个 bridge 网络它是能访问的但那个客户调度中心是裸 Java 进程跑的不在 docker 网络里只能访问宿主机 IP。执行器容器映射到宿主机的端口没有配置好导致外部无法访问。解决办法在 docker-compose 里给执行器加ports: - 9999:9999同时把执行器配置里的xxl.job.executor.address改成宿主机 IP 加映射端口。也就是说容器化执行器时调度中心到执行器的网络通路一定要提前设计好不能只盯着容器内网。6.4 日志排查的几个技巧遇到任务执行失败第一件事不是改代码而是看调度中心的执行日志。在调度日志页面点进某次调度记录能看到两个部分调度结果和执行结果。如果调度结果是失败说明调度中心没能把请求发到执行器网络或者注册的问题。如果调度结果成功但执行结果失败说明任务跑起来了但代码里抛了异常这时候看执行器日志重点看堆栈。如果两个都成功但业务结果不对那问题就在代码业务逻辑上。另外日志详情页每一行都有时间戳可以快速定位某次调度的具体执行链路。多实例部署时调度中心日志里会显示路由策略和所选机器 IP方便你确认这次是哪个实例执行的。实操心得有时候任务没执行但日志里没有任何记录这种情况先看调度中心是否到了触发时间还有调度中心上的调度状态是否正常。如果用的是Cron类型可以点进任务详情看最近 5 次触发时间如果显示触发成功但没有执行日志大概率是执行器回调地址配置有问题。6.5 关于 docker 青龙面板依赖管理和任务脚本的提醒Docker 生态里经常看到有人用青龙面板这类工具来跑各种定时脚本它本身也是通过 Docker 部署的调度工具。有人会问 XXL-JOB 和这类面板有什么区别想用 XXL-JOB 替代或者反过来。其实两者定位不太一样。青龙面板更偏向个人脚本场景安装简单、自带依赖管理能力比如安装 Python 或 Node 依赖适合个人环境跑一些小脚本。XXL-JOB 则是企业级的任务调度平台有完善的任务分组、权限管理、告警监控和多执行器路由适合在业务系统体系内承担定时任务中控角色。如果你是想在 Docker 里同时维护 XXL-JOB 和一堆依赖脚本的执行环境可以在执行器容器里预装好 Python、Node、curl 等工具。比如自定义一个执行器镜像基于 openjdk 再用RUN apt-get install -y python3 nodejs把脚本运行时打进去这样调度中心触发任务时执行器就能直接拉起外部脚本来跑。这个思路比维护一个独立脚本面板跟业务打通更顺滑权限、日志、监控都在 XXL-JOB 平台里统一管。但要注意脚本运行耗时如果远超任务超时时间会被调度中心标记为失败所以在 XXL-JOB 里跑外部脚本超时时间参数要留足余量。7. 进阶扩展从单机到高可用单个调度中心跑起来容易但线上环境肯定要考虑高可用。XXL-JOB 的调度中心本身是无状态的调度状态都存数据库所以横向扩展调度中心实例就行。最简单的方式是同一个镜像起两个容器前面挂 Nginx 做负载均衡。两个实例连同一个 MySQL用户访问哪一个实例看到的任务数据是一致的。新增任务和执行日志都会直接写库。需要注意数据库本身不能单点。调度中心的表不大但对可用性要求高建议至少用 MySQL 主从。任务调度框架挂掉的代价是任务漏跑所以数据库不要求多高性能但要求高可用和自动故障切换。执行器的高可用就简单了多部署几个实例注册到同一个 AppName 分组里利用路由策略分摊流量。执行器实例挂了调度中心在注册表里会自动把它摘除依赖心跳超时机制后续调度就不会再发给它。这里的心跳超时时间可以在系统配置里调默认是 90 秒。如果想在机器宕机后快速切走任务可以调小一点。但调太小网络抖动时容易被误判建议 60 到 90 秒之间比较合理。调度中心的告警功能也建议早点配起来。任务执行失败时可以发邮件告警需要配置邮箱相关信息。这块在系统配置里能找到配置好之后告警对日常运维帮助极大——不用时刻盯调度日志任务失败会第一时间收邮件。另一个进阶操作是把调度中心接入你们已有的监控体系比如 Prometheus。XXL-JOB 本身不直接暴露 metrics但可以用micronaut或者自定义拦截器来暴露任务执行数量的指标。这个属于锦上添花前期建议先把任务日志和告警用起来。8. 日常维护与升级经验调度平台部署完不是结束而是要持续维护的。我拿自己维护这套平台的经验列几个特别容易忽视的点。首先是日志文件。调度中心和执行器都会不断产生日志文件时间久了磁盘会满。建议设置日志保留天数调度中心的 applogs 目录和执行器的 xxl-job 日志目录可以让运维在宿主机上加 crontab 定清理比如只保留最近 7 天的日志。如果你给执行器容器挂载了宿主机目录那定期写一条清理命令到 crontab 就行find /data/xxl-job/executor-logs -type f -mtime 7 -name *.log -delete其次是 xxl_job_log 表的增长。任务数量大时这张表涨得飞快。官方有日志自动清理功能在后台系统配置里可以设置日志保留天数后台会有个线程定期清理。默认值是 3 天你可以根据公司和合规要求调整但别设太长否则数据量大了之后查询变慢。我一般建议保留 7 到 15 天。再一个是版本升级。升级前一定先备份数据库这个最重要。XXL-JOB 从 2.3.0 到 2.4.0 之间数据库结构有过变化如果跨版本升级只替换镜像不迁移数据库启动会报缺少字段。升级的正确步骤是停掉调度中心容器。备份xxl_job库。用最新版源码里的tables_xxl_job.sql对照增量变更执行ALTER TABLE语句补齐字段。替换镜像启动。如果不想手动比对增量 SQL最快的方式是在测试环境用新版跑一遍观察它第一次启动时有没有自动执行迁移脚本再对生产环境操作。官方并不保证所有版本都平滑升级所以生产升级前一定在测试环境完整演练一次。最后是访问权限控制。调度中心后台要限制访问来源如果用的是云服务器把 8080 端口的安全组白名单设成公司出口 IP如果在内网用防火墙规则限制。调度中心的管理员账号不要共用每人一个账号方便审计。还有一个经常被忽略的问题任务权限。XXL-JOB 里执行器分组和用户权限是有对应关系的。给不同团队建不同的执行器分组再分配相应的用户这样 A 团队看不到 B 团队的任务日志也不能互相穿透。这个在团队规模大了之后特别重要。在我实际部署过的环境里真正值得注意的往往是这些细节问题。调度中心本身不复杂Docker 部署也不难但把权限、网络、日志、升级这些事情都安排明白平台才能真正稳定运行。我这边这套方案从 2.2.0 一路升到 2.4.0中间踩过不少坑上面写的这些基本都是亲身经历过的。最后再分享一个小经验如果你在任务日志里看到类似任务结果丢失的情况不要急着改代码先去确认一下执行器的 Netty HTTP 端口是不是一直被某些安全策略拦截。这个端口虽然是随机选的但得保证调度中心到执行器的双向网络畅通。我第一次部署时就是吃了这个亏搞了半天最后发现是云平台安全组策略把执行器端口给禁了。

相关推荐

MemOS MemReader 深度指南:把原始输入翻译成结构化记忆块的“记忆翻译官“
MemOS MemReader 深度指南:把原始输入翻译成结构化记忆块的“记忆翻译官“

人工智能大模型Agent 记忆AI AgentRAG知识图谱dsh-plugin 【免费下载链接】MemOS Self-evolving memory OS for LLM & AI Agents: ultra-persistent memory, hybrid-retrieval, and cross-task skill reuse, with 35.24% token savings and DeepSeek Harness support. 项目… · 2026/9/24 6:38:26

被官方换机工具“抛弃”的第37天,我找到了跨平台迁移的真正解法
被官方换机工具“抛弃”的第37天,我找到了跨平台迁移的真正解法

上个月,我从华为Mate 60 Pro换到了一台iPhone 16 Pro。原以为换机就是“扫码—等待—搞定”,结果在微信聊天记录面前卡了整整一个下午。 华为的“数据克隆”在HarmonyOS生态内确实好用,但它对iOS的支持仅限于联系人、照片和部分视频。微信聊… · 2026/9/24 6:38:13

DA14585 SPI Flash烧录实战:SmartSnippets Toolbox替代Keil指南
DA14585 SPI Flash烧录实战:SmartSnippets Toolbox替代Keil指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 6:38:07

EMQX 升级 gen_rpc 3.5.1:根治节点不可达时的 Crash 日志长尾与 `failed_to_connect_server` 刷屏
EMQX 升级 gen_rpc 3.5.1:根治节点不可达时的 Crash 日志长尾与 `failed_to_connect_server` 刷屏

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 官方变更记录 fix-16453.en.md … · 2026/9/24 7:31:45

ESP32-S3-BOX-3实战:智能语音与物联网联动开发指南
ESP32-S3-BOX-3实战:智能语音与物联网联动开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:31:33

电脑故障处理打印版:一张纸搞定蓝屏、C盘满、重装排查
电脑故障处理打印版:一张纸搞定蓝屏、C盘满、重装排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:31:27

松下A5/A6伺服X4接口位置模式接线指南:7个关键引脚与PLC匹配接法
松下A5/A6伺服X4接口位置模式接线指南:7个关键引脚与PLC匹配接法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:31:08

1850元X99平台实战:E5-2696V3编译Android 12源码全记录
1850元X99平台实战:E5-2696V3编译Android 12源码全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:30:56

轻量级键盘检测工具:基于Raw Input的精准状态诊断
轻量级键盘检测工具:基于Raw Input的精准状态诊断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:30:44

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码