datai/datai-scenes/datai-scene-salesforce/docs/sessions/20260116-metadata-change-auto-sync.md
Kris 21c82a4b36 feat: 添加定时任务功能和文档
- 新增 4 个定时任务类:
  - ObjectSyncTask: 对象自动同步任务
  - ObjectInsertTask: 对象自动插入任务
  - ObjectUpdateTask: 对象自动更新任务
  - MetadataChangeAutoSyncTask: 元数据变更自动同步任务

- 新增 2 个多对象操作接口:
  - insertMultipleObjectDataToTarget: 批量插入对象数据到目标系统
  - updateMultipleObjectDataToTarget: 批量更新对象数据到目标系统

- 新增完整的定时任务文档:
  - task/index.md: 定时任务文档索引
  - ObjectSyncTask.md: 对象自动同步任务文档
  - ObjectInsertTask.md: 对象自动插入任务文档
  - ObjectUpdateTask.md: 对象自动更新任务文档
  - MetadataChangeAutoSyncTask.md: 元数据变更自动同步任务文档
  - RateLimitResetTask.md: 每日限流重置任务文档

- 新增 API 文档索引:api-docs/index.md

- 更新唯一真源文档中心:docs/index.md

- 新增完整的项目文档:
  - REQ-005.md: 定时任务自动同步、插入和更新对象数据需求
  - REQ-006.md: 元数据变更自动同步本地数据库需求
  - 0005-scheduled-tasks-implementation.md: 定时任务架构决策
  - 0006-metadata-change-auto-sync.md: 元数据变更自动同步架构决策
  - 005-scheduled-tasks-implementation.md: 定时任务实现提示词
  - 006-metadata-change-auto-sync.md: 元数据变更自动同步实现提示词
  - 20260116-scheduled-tasks-implementation.md: 定时任务实现会话记录
  - 20260116-metadata-change-auto-sync.md: 元数据变更自动同步实现会话记录
  - 20260116-scheduled-tasks-implementation-retro.md: 定时任务实现复盘
  - 20260116-metadata-change-auto-sync-retro.md: 元数据变更自动同步实现复盘
  - 0015-scheduled-tasks-implementation.md: 定时任务变更记录
  - 0016-metadata-change-auto-sync.md: 元数据变更自动同步变更记录

- 更新 CHANGELOG.md 和 README.md
2026-01-16 16:38:35 +08:00

7.6 KiB
Raw Blame History

会话记录:元数据变更自动同步本地数据库实现

元数据 (Metadata)

  • 会话编号: SESSION-20260116-006
  • 会话标题: 元数据变更自动同步本地数据库实现
  • 触发需求: REQ-006
  • 创建日期: 2026-01-16
  • 开始时间: 2026-01-16 16:00:00
  • 结束时间: 2026-01-16 17:00:00
  • 执行人: AI Assistant
  • 状态: Completed

触发原因

用户需要实现元数据变更自动同步本地数据库功能,具体需求详见 REQ-006

使用提示词

架构决策

执行过程

现状

当前项目中已经存在 datai-quartz 模块,提供了完整的定时任务管理功能。项目中已经有 RateLimitResetTask、ObjectSyncTask、ObjectInsertTask、ObjectUpdateTask 等定时任务实现,可以作为参考。

DataiIntegrationMetadataChangeController 提供了以下同步方法:

  • syncToLocalDatabase(Long id):同步单个元数据变更到本地数据库
  • syncBatchToLocalDatabase(Long[] ids):批量同步元数据变更到本地数据库
  • pullAllMetadataChanges():全对象元数据变更拉取

需要实现的功能:

  1. 在 task 目录下创建定时任务类
  2. 参考 ObjectSyncTask 的写法
  3. 实现元数据变更自动同步逻辑
  4. 判断是否满足自动同步条件

目标

生成元数据变更自动同步定时任务类的完整代码:

  1. MetadataChangeAutoSyncTask.java - 元数据变更自动同步任务

执行步骤

步骤 1查看 IDataiIntegrationMetadataChangeService 接口

  • 查看可用的方法
  • 理解方法参数和返回值
  • 确认 selectUnsyncedMetadataChangeList 和 syncToLocalDatabase 方法

步骤 2查看 ObjectSyncTask 参考实现

  • 查看 ObjectSyncTask 的代码风格和实现方式
  • 理解注解的使用方式(@Component、@Slf4j、@Autowired
  • 理解日志记录的方式

步骤 3生成 MetadataChangeAutoSyncTask.java

  • 参考 ObjectSyncTask 的代码风格
  • 实现元数据变更自动同步逻辑
  • 判断是否满足自动同步条件
  • 调用相应的同步方法

步骤 4验证代码

  • 检查代码语法是否正确
  • 检查代码风格是否符合要求
  • 检查日志记录是否完整
  • 检查异常处理是否完善

执行结果

代码变更

  • 新增文件:
    • d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\MetadataChangeAutoSyncTask.java

代码摘要

MetadataChangeAutoSyncTask.java

  • 类名MetadataChangeAutoSyncTask
  • Bean 名称metadataChangeAutoSyncTask
  • 方法autoSyncMetadataChanges()
  • 功能:扫描所有未同步的元数据变更记录,判断是否满足自动同步条件,调用相应的同步方法
  • 自动同步条件:
    • 通用条件:
      • syncStatus = false 或 null未同步
      • retryCount < 3重试次数小于3次
    • 对象变更条件changeType = OBJECT
      • 对象配置完整objectApi、objectLabel 不为空)
      • 对象启用同步DataiIntegrationObject.isWork = true
      • 对象当前没有正在执行的同步任务DataiIntegrationObject.syncStatus = false
    • 字段变更条件changeType = FIELD
      • 字段配置完整objectApi、fieldApi、fieldLabel 不为空)
      • 对象启用同步DataiIntegrationObject.isWork = true
      • 对象当前没有正在执行的同步任务DataiIntegrationObject.syncStatus = false

代码特点

  1. 参考 ObjectSyncTask 的代码风格

    • 使用 @Component 注解,指定 bean 名称
    • 使用 @Slf4j 注解进行日志记录
    • 使用 @Autowired 注入 DataiIntegrationMetadataChangeService 和 DataiIntegrationObjectService
    • 定义公共方法作为定时任务的执行方法
    • 方法内部有 try-catch 异常处理
    • 记录详细的日志信息
  2. 完善的日志记录

    • 开始执行时记录日志
    • 查询未同步的元数据变更记录时记录日志
    • 每个元数据变更操作前记录日志
    • 每个元数据变更操作成功后记录日志
    • 每个元数据变更操作失败时记录错误日志
    • 元数据变更不满足同步条件时记录日志
    • 任务完成时记录统计信息
  3. 完善的异常处理

    • 外层 try-catch 处理任务级别的异常
    • 内层 try-catch 处理单个元数据变更级别的异常
    • 单个元数据变更同步失败不影响其他元数据变更的处理
    • 同步失败时更新元数据变更记录的同步失败状态
  4. 独立的条件判断方法

    • isAutoSyncConditionMet():判断元数据变更是否满足自动同步条件
    • isObjectChangeConditionMet():判断对象变更是否满足自动同步条件
    • isFieldChangeConditionMet():判断字段变更是否满足自动同步条件
    • 每个方法都详细列出了判断条件,确保条件判断逻辑准确
  5. 同步失败处理

    • updateSyncFailure():更新元数据变更同步失败状态
    • 更新 syncErrorMessage 字段,记录失败原因
    • 增加 retryCount 字段
    • 更新 lastRetryTime 字段

AI 质疑

质疑 1对象配置查询的性能问题

  • 问题:在 isObjectChangeConditionMet 和 isFieldChangeConditionMet 方法中每次判断条件都需要查询对象配置DataiIntegrationObject如果元数据变更记录很多可能会导致性能问题。
  • 解决方案:可以考虑在任务开始时批量查询所有对象配置,缓存到 Map 中,减少数据库查询次数。或者使用 Spring Cache 缓存对象配置。

质疑 2同步失败的处理逻辑

  • 问题:在 updateSyncFailure 方法中,直接调用 updateDataiIntegrationMetadataChange 更新元数据变更记录,如果更新失败,可能会导致重试次数不准确。
  • 解决方案:在 updateSyncFailure 方法中添加 try-catch 处理,确保更新失败时也能正确记录错误日志。

质疑 3条件判断的边界情况

  • 问题:在 isAutoSyncConditionMet 方法中,只判断了 changeType 为 OBJECT 或 FIELD 的情况,如果 changeType 为其他值,会直接返回 false。
  • 解决方案:可以在日志中记录 changeType 为其他值的情况,便于问题排查。

替代方案

方案 1串行执行

  • 优点:简单易实现,避免并发问题
  • 缺点:执行时间较长

方案 2批量执行

  • 优点:减少数据库查询次数,性能适中
  • 缺点:实现复杂度中等

方案 3异步执行

  • 优点:执行时间短,性能高
  • 缺点:需要处理并发问题,实现复杂

最终方案

采用串行执行的方式,实现简单,避免并发问题。单个元数据变更同步失败不影响其他元数据变更的处理。

复现步骤

  1. 查看 IDataiIntegrationMetadataChangeService 接口的方法定义
  2. 查看 ObjectSyncTask 的代码实现
  3. 生成 MetadataChangeAutoSyncTask.java
  4. 验证代码

Commit Hash

待定

相关文档