[061][调度模块]领域驱动的任务调度架构设计与分层实践

简介: 本文介绍基于领域驱动设计(DDD)的六边形调度架构:解耦核心调度逻辑与基础设施,通过Task接口统一抽象、事件驱动日志、Specification动态查询及JSON元数据灵活扩展;采用Record+Builder保障不可变传输,Repository适配器屏蔽ORM细节,全面提升可维护性与可扩展性。(239字)

[061][调度模块]领域驱动的任务调度架构设计与分层实践

1. 整体架构蓝图

该模块采用六边形架构思想,将核心领域(调度、日志)与基础设施(数据库、Web)解耦。核心设计决策如下:

  • 任务定义与运行时分离JobEntity 作为持久化配置,ScheduleTaskManager 管理内存中的执行实例,通过 Task 接口统一抽象。
  • 事件驱动的日志记录:状态变更事件异步触发日志持久化,避免阻塞调度主流程。
  • 规格模式(Specification):动态查询条件组合,避免冗长的 JPQL 拼接。
┌─────────────────────────────────────────────────────────────┐
│                    表示层 (Web)                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐ │
│  │ JobEndpoint  │  │ScheduleEndpoint│  │ JobLogEndpoint  │ │
│  └──────────────┘  └──────────────┘  └──────────────────┘ │
└─────────────────────────┬───────────────────────────────────┘
                          │ DTO/VO 转换
┌─────────────────────────▼───────────────────────────────────┐
│                    应用服务层 (Service)                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐ │
│  │  JobService  │  │ScheduleService│  │  JobLogService  │ │
│  └──────────────┘  └──────────────┘  └──────────────────┘ │
└─────────────────────────┬───────────────────────────────────┘
                          │ 领域接口
┌─────────────────────────▼───────────────────────────────────┐
│                    领域层 (Domain)                          │
│  ┌────────────────────────────────────────────────────────┐ │
│  │  interface Task  ◄─── implements  ──── JobEntity      │ │
│  │  interface TaskRepository  ◄─── implements ────       │ │
│  │            DatabaseTaskRepository (适配 JPA)          │ │
│  │  interface ChangeStatusEventConsumer ◄─── implements  │ │
│  │            JobLogEventConsumer (事件监听)             │ │
│  └────────────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────┘
                          │ JPA
┌─────────────────────────▼───────────────────────────────────┐
│                    基础设施层 (Infrastructure)               │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐ │
│  │ JobRepository│  │JobLogRepository│  │ ScheduleTask    │ │
│  │  (JPA)       │  │   (JPA)       │  │   Manager       │ │
│  └──────────────┘  └──────────────┘  └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘

2. 核心领域模型:Task 接口与 JobEntity 实现

技术亮点:接口统一 + 多态持久化

Task 接口定义了调度器所需的所有配置方法,JobEntity 通过实现该接口,既可作为 JPA 实体,又能直接注入调度管理器。

// 调度核心定义的任务契约
public interface Task {
   
    String getTaskCode();
    String getClassSimpleName();
    String getCron();
    boolean isEnabled();
    String getDescription();
    Map<String, String> getMetadata();
    Duration getInitialDelay();
    Integer getMaxFailureCount();
    Integer getMaxExecutionCount();
    Instant getDueDate();
}

// 领域实体同时实现接口与 JPA 注解
@Data
@Entity
@Table(name = "feat_job")
public class JobEntity extends BaseStatusEntity implements Task {
   
    @Column(length = 64, unique = true, updatable = false)
    private String taskCode;

    @Column(length = 64)
    private String classSimpleName;

    @Column(length = 64)
    private String cron;

    @JdbcTypeCode(SqlTypes.JSON)  // ✅ 利用 Hibernate 6 的 JSON 映射
    @Column(columnDefinition = "json")
    private Map<String, String> metadata;

    // ... 其他字段

    @Override
    public boolean isEnabled() {
   
        // 利用父类状态字段实现软删除 + 预留双重语义
        return Objects.equals(getDataStatus(), DataStatusEnum.NORMAL)
                || Objects.equals(getDataStatus(), DataStatusEnum.RESERVED);
    }
}

设计精要:

  • JSON 元数据@JdbcTypeCode(SqlTypes.JSON) 自动序列化 Map 为 JSON 列,支持灵活扩展而无需 DDL 变更。
  • 状态语义NORMAL 为正常启用,RESERVED 为保留(可被特殊逻辑触发),DELETED 为逻辑删除,丰富了生命周期管理。

3. 仓库适配层:DatabaseTaskRepository 的防腐作用

技术亮点:适配器模式隔离 ORM 依赖

@Service
@RequiredArgsConstructor
public class DatabaseTaskRepository implements TaskRepository<JobEntity> {
   
    private final JobRepository jobRepository;  // Spring Data JPA

    @Override
    public Optional<JobEntity> findByTaskCode(String taskCode) {
   
        return jobRepository.findByTaskCode(taskCode);
    }

    @Override
    public List<JobEntity> findAll() {
   
        return jobRepository.findAll();
    }
}

通过实现 TaskRepository 接口,上层 ScheduleService 完全不知晓 JPA 的存在。若将来迁移至 MyBatis 或 Redis,只需替换该适配类,业务逻辑零修改。

4. 不可变数据传输:Record + Builder 模式

TaskExecutionDetails 使用 @Builder 注解构建不可变对象,聚合任务定义与运行时状态:

@Builder
public record TaskExecutionDetails(
    String taskCode,          // 任务标识
    String classSimpleName,   // 执行类
    String cron,              // 调度表达式
    boolean enabled,          // 是否启用
    String description,       // 描述
    Map<String, String> metadata,  // 扩展属性(不可变视图)
    Duration initialDelay,
    Integer maxFailureCount,
    Integer maxExecutionCount,
    Instant dueDate,
    // 以下为运行时动态数据
    TaskStatusEnum taskStatus,
    String lotNo,
    int totalCount,
    int totalFailureCount,
    Instant startTime,
    Instant endTime,
    String message,
    Throwable throwable
) {
   }

技术亮点:

  • Record 不可变性:天然线程安全,适合多线程环境下的数据传递。
  • Builder 模式:支持部分字段构建,结合 MapUtils.unmodifiableMap 保证元数据只读。
目录
相关文章
|
23天前
|
人工智能 开发框架 Java
如何入门学习 Agent 开发?
本文分享Agent开发实战经验:强调甄别一手资讯、聚焦Context本质而非框架、坚持实操落地、重视效果评测与自我迭代,助新手避开玄学误区,从真实场景出发高效入门。(238字)
82 5
|
22天前
|
弹性计算 小程序 iOS开发
阿里云无影云电脑个人版指南:快速购买、选择无影套餐、配置云电脑、连接及使用全流程
阿里云无影云电脑个人版,支持Windows/macOS/手机多端接入,提供黄金至黑金6档灵活套餐(14.9元/月起),含系统盘、数据盘、带宽及灵豆配额,适用于办公、学习、设计与游戏。一键配置、即连即用,休眠不计费,数据安全可靠。
267 2
|
22天前
|
存储 关系型数据库 MySQL
读写混合TPS差六倍,PostgreSQL与MySQL架构差异实测
从架构设计、索引实现、事务隔离、复制机制、运维体验五个维度深度对比PostgreSQL与MySQL,覆盖MySQL 9.0向量检索与PostgreSQL 17新特性,附权威基准数据和选型决策框架
|
6天前
|
安全 前端开发 Java
[067][公共模块]构建优雅的Java异常处理框架:从错误码到统一响应
本文介绍了一套优雅的Java异常处理框架,涵盖错误码枚举、反馈模型、运行时异常与统一响应体四大核心模块,实现错误集中管理、HTTP语义合规、上下文可追溯及前后端响应标准化,显著提升系统健壮性与可维护性。(239字)
41 1
|
22天前
|
SQL Serverless 数据库连接
Serverless 数据库最怕什么?不是没连接,而是连接“太多了”
Serverless 数据库最怕什么?不是没连接,而是连接“太多了”
53 1
|
23天前
|
人工智能 算法 API
【第二部分:大模型应用开发基础】9. RAG 是什么,它与 Agent 有什么关系?——从知识库问答到 Agentic RAG
RAG 通过文档解析、切分、Embedding、混合检索、Rerank 与引用机制,让大模型在回答问题时能够按需获取企业知识,而不是依赖训练数据“记住一切”。文章进一步介绍 RAG 如何从固定的检索增强生成流程演进到 Agentic RAG:由 Agent 判断是否需要检索、如何规划 Query、证据是否充分,并在必要时继续改写和多轮检索。同时梳理 RAG、Memory、Tool 与 Agent 的边界,强调知识库问答系统并不等同于 Agent,RAG 只是 Agent 获取外部知识的一种能力。
202 2
|
2月前
|
存储 缓存 NoSQL
[032][缓存模块]基于Redis Bitmap的用户行为统计实战:签到与日活分析
本文详解如何用Redis Bitmap实现高效用户行为统计:基于Spring Boot,通过`RedisBitmapUtils`封装位图操作(设位、计数、AND/OR运算),配合`UserActivityController`提供签到、DAU、连续N日/周活跃等API。空间极省、查询毫秒级,适合亿级用户场景。(239字)
146 2
|
22天前
|
缓存 运维 数据挖掘
Qwen3.8‑Max能干什么?编程办公长文档处理能力与实战配置
通义千问Qwen3.8‑Max作为Qwen产品序列当中定位最高的旗舰基座模型,面向复杂推理、大规模代码工程、长周期智能体任务、百万级token长文档解析以及多模态综合处理场景打造,依托稀疏混合专家MoE架构完成性能跃迁,在通用对话、专业办公、全栈软件开发、科研分析、图文理解等多个维度实现能力升级,是面向开发者、企业业务、科研人员的高性能生成式AI基座。很多使用者会把它和系列内Plus、Flash版本混淆,Max版本并非简单参数放大,而是在推理深度、长任务稳定性、多模态原生融合、工具调用能力上做定向强化,适合处理高难度、高复杂度的生产级业务,不适合简单闲聊、轻量文案生成这类低消耗场景,如果业务只
222 0
|
2月前
|
人工智能 自然语言处理 算法
AI搜索可信度工程指南:内容可信度、实体优化与知识图谱建设
AI搜索时代,企业网站优化重心正从关键词排名转向可信度、实体权威与知识一致性。内容需真实可验、作者明确、来源清晰;结构化数据(Schema)与知识图谱建设至关重要。赢得AI信任,方能成为其答案生态中的可信知识源。(239字)
200 1
|
2月前
|
存储 人工智能 安全
从RAG到知识图谱:企业AI知识库的技术范式革命与未来十年路线图
本文从CTO视角剖析企业AI知识库的技术范式革命:RAG正经历三代跃迁,迈向多跳推理与自适应检索;知识图谱在大模型时代强势复兴,实现文件关联、专家发现与影响分析;架构上加速向多云融合、跨平台统一数据层及新私有化演进;管理上推动知识全生命周期、物理级隔离与价值量化。未来十年,知识库将升维为战略资产。(239字)
288 0