任务调度
任务调度模块基于 Snail Job 实现分布式任务调度,管理端默认关闭,需部署调度服务端并配置启用后可在线管理任务与查看执行日志。
本文是 4.x 的归档文档(冻结于 v4.2.0)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 4.2.x 为准,不建议用于新项目。
新项目请查看 5.x 最新文档。已在 4.2.x 上运行的项目,本文仍是可靠依据。
任务调度模块位于 continew-plugin-schedule,底层调度引擎为 Snail Job 1.10.0。整体分三部分:独立部署的调度中心服务端(Snail Job Server,负责任务分发与重试)、内嵌在业务服务中的客户端(snail-job-client-starter,注册并执行具体任务)、ContiNew Admin 的管理界面(经 OpenFeign 调用 Snail Job OpenAPI 做任务与日志管理)。调度数据落库于独立的 sj_* 系列表(23 张),与业务库分离。
启用开关与默认状态
模块受 snail-job.enabled 开关控制。dev 环境默认 false,prod 环境默认 true。两个条件注解完成装配切换。
ConditionalOnEnabledScheduleJob:开关为 true 时装配SnailJobConfiguration(@EnableSnailJob与日志上报)、JobController、JobLogController;ConditionalOnDisabledScheduleJob:开关为 false 时装配DefaultController,接管/schedule/job与/schedule/log下全部请求,统一返回「任务模块已禁用,请于对应环境配置文件中配置 snail-job.enabled 为 true 进行启用」。
部署调度服务端
仓库提供 continew-extension-schedule-server 模块作为本地开发用的调度中心,启动类 ScheduleServerApplication 继承 Snail Job 官方的 SnailJobServerApplication,通过 Liquibase 独立 changelog 初始化 sj_* 表,数据默认落在 continew_admin_job 库。dev 环境 Web 端口 8001、通讯端口 17888,prod 环境 Web 端口 18001。生产部署也可以按 Snail Job 官方文档搭建服务端,二者等价。
Docker Compose 部署时 docker-compose.yml 已包含 schedule-server 服务(镜像 schedule-server:1.8.0),与主服务同网编排。
业务服务侧的连接配置(application-dev.yml 节选)。
snail-job:
enabled: false
server:
host: ${SCHEDULE_HOST:127.0.0.1}
port: ${SCHEDULE_PORT:17888}
api:
url: http://127.0.0.1:8001/snail-job
username: ${SCHEDULE_USERNAME:admin}
password: ${SCHEDULE_PASSWORD:admin}
openapi:
port: 8001
port: 17889
namespace: ${SCHEDULE_NAMESPACE:764d604ec6fc45f68cd92514c40e9e1a}
group: ${SCHEDULE_GROUP:continew-admin}
token: ${SCHEDULE_TOKEN:SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj}prod 环境 SCHEDULE_PASSWORD 与 SCHEDULE_TOKEN 无默认值,必须由环境变量注入,缺失即启动失败。namespace 与 group 要与调度服务端控制台中创建的命名空间、组配置保持一致。
任务管理
「任务调度 → 任务管理」(菜单 ID 8010)对应接口前缀 /schedule/job,提供分页查询、新增、修改、修改状态、删除、手动执行、任务组列表七个接口。管理操作不落本地库,JobServiceImpl 经 OpenFeign(JobApi、JobGroupApi)或 SnailJobOpenApi 直接调用调度服务端的 OpenAPI。
新增任务的字段由 JobReq 定义,常用的几组如下。
- 基本信息:任务组、任务名称、描述;
- 触发:触发类型(Cron、固定间隔等
JobTriggerTypeEnum)与间隔时长,页面内置 GenCron 组件辅助生成 Cron 表达式; - 执行:任务类型(
JobTaskTypeEnum,如单机、广播、分片)、执行器名称(客户端注册的执行器 Bean 名)、任务参数; - 策略:路由策略(
JobRouteStrategyEnum)、阻塞策略(JobBlockStrategyEnum)、超时时间、最大重试次数、重试间隔、并行数。
「执行任务」按钮调用 POST /schedule/job/trigger/{id}(权限码 schedule:job:trigger)立即触发一次,常用于联调。
任务日志
「任务调度 → 任务日志」(菜单 ID 8020)对应接口前缀 /schedule/log,查询每次任务实例的执行记录:触发原因、执行状态、执行节点、耗时与失败堆栈。日志由客户端经 SnailLogbackAppender 上报到调度服务端(SnailJobConfiguration.onStarting 在服务启动时挂载该 Appender),管理界面再从 OpenAPI 查询,本地同样不留存。
任务日志页面拉取的是调度服务端的执行日志,与「系统监控 → 系统日志」中记录的管理操作日志(登录、新增任务等)是两个来源。
相关源码
- JobController.java 与 JobLogController.java:任务与任务日志 API
- SnailJobConfiguration.java:客户端装配与日志上报
- ScheduleServerApplication.java:调度服务端启动类
- continew-admin-ui/src/views/schedule/:前端页面