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

简介: 本文介绍调度模块的任务生命周期事件机制,通过`ChangeStatusEvent`事件与`ChangeStatusEventConsumer`监听器,实现任务状态(CREATED/STARTED/COMPLETED等)变更的灵活监听。支持日志、持久化、消息推送等扩展,具备高解耦性与异常隔离能力。(239字)

[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. 设计优势

  • 解耦:任务调度核心不关心事件被如何使用,只需广播。
  • 多监听器:支持任意数量的消费者,且异常隔离(单个消费者异常不影响其他消费者)。
目录
相关文章
|
3月前
|
缓存 NoSQL Java
[037][缓存模块]基于 Guava Striped 的声明式本地锁设计与实现
本文介绍基于Guava Striped与Spring AOP实现的声明式本地锁:通过`@LocalLockable`注解+SpEL动态生成细粒度锁key,支持超时控制与中断处理,内存可控、低延迟,适用于单机高并发场景。
107 1
|
3月前
|
缓存 NoSQL Java
[065][缓存模块]Hibernate二级缓存自定义实现:基于Spring Cache的多级缓存适配器
本文介绍了一种基于Spring Cache的Hibernate二级缓存自定义实现,通过适配`DomainDataStorageAccess`与`RegionFactoryTemplate`,统一ORM与应用层缓存。支持本地(Caffeine)、远程(Redis)、多级及租户隔离等灵活策略,配置即生效,无缝集成Spring Boot生态。(239字)
95 2
|
3月前
|
安全 调度 数据库
[062][调度模块]任务全生命周期管理 —— 从启动到追踪的完整闭环
本文详解调度模块任务全生命周期管理:涵盖启动/取消协调(ScheduleService)、三级数据聚合(DB+内存+运行态)、运行态安全校验及规格模式分页查询,实现高可用、强一致的任务闭环管控。(239字)
84 1
|
3月前
|
NoSQL Java 调度
[060][调度模块]Redisson vs Redis 原生锁:两种分布式锁实现深度对比
本文深度对比调度模块中Redis原生锁与Redisson锁:前者轻量但功能简陋(无重入、无阻塞),需手动续期;后者支持可重入、自动看门狗续期、阻塞等待,API友好但依赖较重。结合场景选型更可靠。(239字)
158 1
|
3月前
|
存储 缓存 NoSQL
[038][验证码模块]基于 Hutool 的 Spring Boot 验证码组件设计与实现
本文介绍基于Hutool与Spring Boot深度集成的验证码组件,支持线段、圆圈、扭曲、GIF四类验证码,具备自动配置、多级缓存(Caffeine+Redis)、高斯模糊增强、忽略大小写校验及一次性使用等特性,架构清晰、扩展性强,开箱即用。
129 2
|
3月前
|
运维 Java 调度
[059][调度模块]配置驱动的任务仓库 – 从 YAML 加载任务
本文介绍基于YAML配置驱动的任务仓库实现,支持通过`application.yml`声明定时任务(cron、开关、重试等),`YamlTaskRepository`自动解析并提供CRUD接口,无缝集成`ScheduleTaskManager`,兼顾运维灵活性与扩展性。
82 1
|
3月前
|
缓存 NoSQL 安全
[036][缓存模块]基于 Redis 自定义缓存锁的设计与实现
本文介绍基于Redis的轻量级分布式缓存锁组件,通过`@RedisLockable`注解+ AOP + Lua脚本,支持固定租期与自动续期双模式,解决缓存击穿、重复计算与资源竞争问题,具备声明式、动态Key、原子性及安全释放等特性,代码开源可扩展。(239字)
127 2
|
3月前
|
NoSQL 调度 Redis
[057][调度模块]分布式环境下定时任务的防重复执行方案
本文介绍分布式定时任务防重复执行方案,基于Redis/Redisson分布式锁,提供自动续期与固定租期两种模式,通过`key()`控制锁粒度,支持异常跳过与自定义处理,确保集群中同一任务仅单点执行。代码开源。
165 1
|
3月前
|
人工智能 Java BI
【AI】Agent 全栈进阶|大模型基础与对话调用
本文开启Agent代码实操,先讲解大语言模型底层原理,依托LangChain框架搭配阿里百炼接口,演示基础对话、系统提示词角色扮演、图片多模态识别与多轮上下文会话,附带完整可运行Python代码
442 3
|
3月前
|
固态存储 Java Linux
SSD用户必须了解的TRIM功能,到底有什么作用?
SSD用久变慢?很可能是TRIM未启用!TRIM是操作系统通知SSD及时清理无效数据的关键机制,能显著降低写入放大、维持长期性能、延长寿命。本文详解其原理、检查与开启方法(Windows/Linux/macOS),并附4K对齐、固件更新等实用优化建议。(239字)