184 lines
7.6 KiB
Markdown
184 lines
7.6 KiB
Markdown
# 会话记录:元数据变更自动同步本地数据库实现
|
||
|
||
## 元数据 (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):
|
||
- 对象配置完整(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
|
||
|
||
待定
|
||
|
||
## 相关文档
|
||
|
||
- [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) - 元数据变更自动同步本地数据库实现提示词
|