抽象类适合定义分布式任务调度器的统一执行骨架,通过分离“变”与“不变”:生命周期方法(registerjob、acquirenexttrigger等)声明为抽象,共性能力(parsecron、wrapwithretry等)封装为final,钩子方法(onjobmissed、beforeschedulestart等)支持扩展,强制约束clusterid/instanceid、schedulerstate和依赖校验。

抽象类适合定义分布式任务调度器的统一执行骨架,关键在于把“变”和“不变”分离:不变的是调度生命周期(注册、触发、执行、状态反馈),变的是集群协调方式、存储策略、故障恢复逻辑。
定义核心生命周期方法为抽象方法
在抽象调度器类中,不实现具体调度行为,只声明必须由子类覆盖的关键环节:
- registerJob(Job job):任务注册入口,子类决定是写入数据库、ZooKeeper 还是 Redis
- acquireNextTrigger():获取下一个待触发任务,需支持分布式抢锁(如基于 Redis Lua 或 ZooKeeper 临时顺序节点)
- executeLocally(Job job):本地执行封装,隔离线程池管理、异常捕获、日志埋点等共性逻辑
- reportExecutionResult(ExecutionReport report):执行结果上报,子类可对接监控系统或持久化到分库分表
封装可复用的共性能力为 final 方法
这些逻辑与分布式拓扑无关,适合在抽象类中固化,避免子类重复实现:
- parseCron(String expr):统一调用 CronExpression(Quartz 提供)做表达式校验与下次触发时间计算
- buildJobKey(String group, String name):强制使用统一格式(如 group:name),便于跨节点识别同一任务
- wrapWithRetry(Runnable task, int maxRetries):内置指数退避重试模板,子类可直接套用
- validateJobConfig(Job job):检查必填字段、Cron 格式、超时阈值等,失败抛统一 InvalidJobException
预留扩展点支持差异化策略
通过受保护的钩子方法(hook method),允许子类选择性增强,不破坏主流程:
- onJobMissed(Job job):默认空实现,XXL-JOB 子类可在此触发补偿调度;Elastic-Job 子类可记录告警并跳过
- beforeScheduleStart():用于初始化分布式锁客户端、连接注册中心等一次性资源
- shouldSkipExecution(Job job, TriggerContext context):支持灰度开关、业务规则拦截(如“仅工作日执行”)
强制约定基础属性与构造约束
从源头保障一致性:
- 所有子类必须传入 clusterId 和 instanceId,用于日志追踪与脑裂识别
- 抽象类内部维护 schedulerState(STOPPED / STARTING / RUNNING / PAUSED),禁止子类直接修改,仅提供 start()、pause() 等受控方法
- 要求子类在构造时校验依赖组件(如 ZooKeeper client 是否 connected,DataSource 是否可用),否则抛 IllegalStateException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











