datai/docs/archive/sessions/20260116-metadata-change-auto-sync.md

184 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 会话记录:元数据变更自动同步本地数据库实现
## 元数据 (Metadata)
- **会话编号**: SESSION-20260116-006
- **会话标题**: 元数据变更自动同步本地数据库实现
- **触发需求**: [REQ-006](../requirements/REQ-006.md)
- **创建日期**: 2026-01-16
- **开始时间**: 2026-01-16 16:00:00
- **结束时间**: 2026-01-16 17:00:00
- **执行人**: AI Assistant
- **状态**: Completed
## 触发原因
用户需要实现元数据变更自动同步本地数据库功能,具体需求详见 [REQ-006](../requirements/REQ-006.md)。
## 使用提示词
- [006-metadata-change-auto-sync.md](../prompts/006-metadata-change-auto-sync.md) - 元数据变更自动同步本地数据库实现提示词
## 架构决策
- [0006-metadata-change-auto-sync.md](../decisions/adr/0006-metadata-change-auto-sync.md) - 元数据变更自动同步本地数据库架构决策
## 执行过程
### 现状
当前项目中已经存在 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
- 对象配置完整objectApiobjectLabel 不为空
- 对象启用同步DataiIntegrationObject.isWork = true
- 对象当前没有正在执行的同步任务DataiIntegrationObject.syncStatus = false
- 字段变更条件changeType = FIELD
- 字段配置完整objectApifieldApifieldLabel 不为空
- 对象启用同步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
待定
## 相关文档
- [REQ-006](../requirements/REQ-006.md) - 元数据变更自动同步本地数据库需求
- [0006-metadata-change-auto-sync](../decisions/adr/0006-metadata-change-auto-sync.md) - 元数据变更自动同步本地数据库架构决策
- [006-metadata-change-auto-sync](../prompts/006-metadata-change-auto-sync.md) - 元数据变更自动同步本地数据库实现提示词