抽象类不参与调度,而是封装前置/后置通知模板,供定时任务类继承并实现doExecute(),再通过execute()统一调用钩子;支持Spring @Scheduled、Quartz及线程池,解耦框架且可扩展失败/成功回调。

抽象类本身不直接参与定时任务调度,但它可以作为统一通知逻辑的骨架,为前置与后置通知提供可复用、可扩展的标准结构。关键不是“在调度中定义抽象类”,而是用抽象类封装通知行为模板,再由具体定时任务实现类继承并注入到调度流程中。
抽象通知基类定义统一钩子
定义一个抽象类,声明前置(beforeExecute)和后置(afterExecute)两个模板方法,并提供默认空实现:
- 子类按需重写其中任一或全部,避免强制实现无关逻辑
- 抽象类内部可封装通用能力,如日志上下文绑定、耗时统计、异常标记等
- 不依赖 Spring AOP 注解,保持与调度框架(如
@Scheduled、Quartz 或 ScheduledThreadPoolExecutor)解耦
定时任务类继承并组合执行逻辑
具体任务类继承该抽象类,将业务逻辑与通知逻辑自然融合:
- 重写
doExecute()方法(抽象模板方法),放置核心业务代码 - 在
run()或execute()方法中显式调用beforeExecute()→doExecute()→afterExecute() - 这样每个任务实例都自带标准生命周期钩子,无需额外切面或代理
与 Spring @Scheduled 配合使用示例
若用 @Scheduled 触发,推荐将抽象任务包装为 @Component Bean,通过方法调用而非反射触发钩子:
立即学习“Java免费学习笔记(深入)”;
- 避免在
@Scheduled方法内直接写通知逻辑,保持职责清晰 - 让定时方法只负责“调度入口”,真正执行委托给继承自抽象基类的任务实例
- 例如:
@Scheduled(fixedDelay = 60000) public void triggerTask() { myTask.execute(); }
适配 Quartz 或手动线程池更灵活
当需要更精细控制(如任务分组、失败重试、状态回调)时,抽象类可进一步扩展:
- 增加
onFailure(Throwable)、onSuccess()等回调模板方法 - 支持传入
JobExecutionContext或自定义上下文对象,便于获取调度元数据 - 配合
Job实现类或Runnable包装器,实现“一次定义,多处复用”


















