[058][调度模块]任务生命周期事件与监听器机制
摘要
为了便于监控、审计或联动其他系统,框架定义了 ChangeStatusEvent 事件和 ChangeStatusEventConsumer 接口,使外部可以订阅任务状态变化。本文分析事件产生、消费流程及扩展方式。
1. 事件定义
@Builder
public record ChangeStatusEvent(
Instant timestamp,
String taskName,
TaskStatusEnum taskStatus,
TaskCondition lastTaskCondition,
String message,
Throwable throwable
) {
}
状态包括:CREATED、STARTED、COMPLETED、STOPPED、CANCELLED、EXCEPTION。
2. 事件触发点
在 ScheduleTaskManager 中,每个关键操作都会调用 notifyListeners():
private void startEvent(String taskName) {
notifyListeners(taskName, TaskStatusEnum.STARTED, null, null);
}
private void stopEvent(String taskName, String message) {
doCancelTask(taskName);
notifyListeners(taskName, TaskStatusEnum.STOPPED, message, null);
}
// 类似地,completeEvent, failureEvent, cancelEvent...
3. 消费者注册
ScheduleTaskManager 构造函数接收 ObjectProvider<ChangeStatusEventConsumer>,将所有实现了该接口的 Bean 收集起来:
public ScheduleTaskManager(TaskRepository<?> taskRepository,
List<ChangeStatusEventConsumer> consumers) {
this.taskRepository = taskRepository;
this.consumers = consumers;
}
消费者可以是任何 Spring Bean,例如:
@Component
@Slf4j
public class LoggingEventConsumer implements ChangeStatusEventConsumer {
@Override
public void consumer(ChangeStatusEvent event) {
log.info("任务 {} 状态变为 {}", event.taskName(), event.taskStatus());
}
}
4. 扩展点
- 持久化事件到数据库,用于历史追踪。
- 通过消息队列将事件转发到其他微服务。
- 结合监控系统(如 Prometheus)实时上报任务执行情况。
5. 设计优势
- 解耦:任务调度核心不关心事件被如何使用,只需广播。
- 多监听器:支持任意数量的消费者,且异常隔离(单个消费者异常不影响其他消费者)。