# 会话记录:元数据变更自动同步本地数据库实现 ## 元数据 (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) - 元数据变更自动同步本地数据库实现提示词