[058][调度模块]任务生命周期事件与监听器机制

[058][调度模块]任务生命周期事件与监听器机制

本文章代码: gitee , gitcode , github

摘要

为了便于监控、审计或联动其他系统,框架定义了 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. 设计优势

  • 解耦:任务调度核心不关心事件被如何使用,只需广播。
  • 多监听器:支持任意数量的消费者,且异常隔离(单个消费者异常不影响其他消费者)。
posted @ 2026-08-10 08:31  杨运交  阅读(5)  评论(0)    收藏  举报