# 会话记录:定时任务自动同步、插入和更新对象数据 ## 元数据 (Metadata) - **会话编号**: SESSION-20260116-005 - **会话标题**: 定时任务自动同步、插入和更新对象数据实现 - **触发需求**: [REQ-005](../requirements/REQ-005.md) - **创建日期**: 2026-01-16 - **开始时间**: 2026-01-16 14:00:00 - **结束时间**: 2026-01-16 15:00:00 - **执行人**: AI Assistant - **状态**: Completed ## 触发原因 用户需要实现定时任务自动同步、插入和更新对象数据功能,具体需求详见 [REQ-005](../requirements/REQ-005.md)。 ## 使用提示词 - [005-scheduled-tasks-implementation.md](../prompts/005-scheduled-tasks-implementation.md) - 定时任务自动同步、插入和更新对象数据实现提示词 ## 架构决策 - [0005-scheduled-tasks-implementation.md](../decisions/adr/0005-scheduled-tasks-implementation.md) - 定时任务自动同步、插入和更新对象数据架构决策 ## 执行过程 ### 现状 当前项目中已经存在 datai-quartz 模块,提供了完整的定时任务管理功能。项目中已经有 RateLimitResetTask 这样的定时任务实现,可以作为参考。 需要实现的功能: 1. 在 task 目录下创建三个定时任务类 2. 参考 RateLimitResetTask 的写法 3. 实现对象自动同步任务 4. 实现对象自动插入任务 5. 实现对象自动更新任务 ### 目标 生成三个定时任务类的完整代码: 1. ObjectSyncTask.java - 对象自动同步任务 2. ObjectInsertTask.java - 对象自动插入任务 3. ObjectUpdateTask.java - 对象自动更新任务 ### 执行步骤 #### 步骤 1:查看 RateLimitResetTask 参考实现 - 查看 RateLimitResetTask 的代码风格和实现方式 - 理解注解的使用方式(@Component、@Slf4j、@Autowired) - 理解日志记录的方式 #### 步骤 2:查看 DataiIntegrationObject 实体类 - 查看对象的字段定义 - 理解判断条件的字段(isWork、syncStatus、isIncremental、isCreateable、isUpdateable、totalRows 等) #### 步骤 3:查看 IDataiIntegrationObjectService 接口 - 查看可用的方法 - 理解方法参数和返回值 #### 步骤 4:生成 ObjectSyncTask.java - 参考 RateLimitResetTask 的代码风格 - 实现对象自动同步逻辑 - 判断是否满足同步条件 - 调用相应的同步方法 #### 步骤 5:生成 ObjectInsertTask.java - 参考 RateLimitResetTask 的代码风格 - 实现对象自动插入逻辑 - 判断是否满足插入条件 - 调用相应的插入方法 #### 步骤 6:生成 ObjectUpdateTask.java - 参考 RateLimitResetTask 的代码风格 - 实现对象自动更新逻辑 - 判断是否满足更新条件 - 调用相应的更新方法 #### 步骤 7:验证代码 - 检查代码语法是否正确 - 检查代码风格是否符合要求 - 检查日志记录是否完整 - 检查异常处理是否完善 ## 执行结果 ### 代码变更 - 新增文件: - `d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\ObjectSyncTask.java` - `d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\ObjectInsertTask.java` - `d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\ObjectUpdateTask.java` ### 代码摘要 #### ObjectSyncTask.java - 类名:ObjectSyncTask - Bean 名称:objectSyncTask - 方法:autoSyncObjects() - 功能:扫描所有对象,判断是否满足同步条件,调用相应的同步方法 - 同步条件: - isWork = true(启用同步) - syncStatus = false(当前没有正在执行的同步任务) - 对象配置完整(api、label 等关键字段不为空) - 存量同步 vs 增量同步: - 存量同步:isIncremental = false(增量更新为 false) - 增量同步:isIncremental = true(增量更新为 true) #### ObjectInsertTask.java - 类名:ObjectInsertTask - Bean 名称:objectInsertTask - 方法:autoInsertObjects() / autoInsertObjects(String targetOrgType) - 功能:扫描所有对象,判断是否满足插入条件,调用相应的插入方法 - 插入条件: - isCreateable = true(可创建) - totalRows > 0(对象有本地数据) - 对象配置完整(api、label 等关键字段不为空) - 默认目标ORG类型:Sandbox #### ObjectUpdateTask.java - 类名:ObjectUpdateTask - Bean 名称:objectUpdateTask - 方法:autoUpdateObjects() / autoUpdateObjects(String targetOrgType) - 功能:扫描所有对象,判断是否满足更新条件,调用相应的更新方法 - 更新条件: - isUpdateable = true(可更新) - totalRows > 0(对象有本地数据) - 对象配置完整(api、label 等关键字段不为空) - 默认目标ORG类型:Sandbox ### 代码特点 1. **参考 RateLimitResetTask 的代码风格**: - 使用 @Component 注解,指定 bean 名称 - 使用 @Slf4j 注解进行日志记录 - 使用 @Autowired 注入 IDataiIntegrationObjectService - 定义公共方法作为定时任务的执行方法 - 方法内部有 try-catch 异常处理 - 记录详细的日志信息 2. **完善的日志记录**: - 开始执行时记录日志 - 每个对象操作前记录日志 - 每个对象操作成功后记录日志 - 每个对象操作失败时记录错误日志 - 任务完成时记录统计信息 3. **完善的异常处理**: - 外层 try-catch 处理任务级别的异常 - 内层 try-catch 处理单个对象级别的异常 - 单个对象操作失败不影响其他对象的处理 4. **灵活的参数设计**: - ObjectInsertTask 和 ObjectUpdateTask 提供了两个方法: - autoInsertObjects() / autoUpdateObjects():使用默认目标ORG类型 - autoInsertObjects(String targetOrgType) / autoUpdateObjects(String targetOrgType):自定义目标ORG类型 ## AI 质疑 ### 质疑 1:targetOrgType 参数的处理 - **问题**:在 ObjectInsertTask 和 ObjectUpdateTask 中,需要调用 insertObjectDataToTarget 和 updateObjectDataToTarget 方法,这两个方法需要 targetOrgType 参数。如何获取 targetOrgType? - **解决方案**:提供了两个方法: - autoInsertObjects() / autoUpdateObjects():使用默认值 "Sandbox" - autoInsertObjects(String targetOrgType) / autoUpdateObjects(String targetOrgType):允许自定义 targetOrgType - 这样既提供了默认值,又允许灵活配置 ### 质疑 2:定时任务的执行时间 - **问题**:定时任务的执行时间应该如何配置? - **解决方案**:通过 datai-quartz 模块的 SysJob 实体配置,使用 Cron 表达式。可以在 SysJobController 中配置定时任务的执行时间、启用状态等。 ### 质疑 3:并发执行的问题 - **问题**:如果多个对象同时满足条件,是否需要并发执行? - **解决方案**:采用串行执行的方式,实现简单,避免并发问题。单个对象操作失败不影响其他对象的处理。 ## 替代方案 ### 方案 1:串行执行 - 优点:简单易实现,避免并发问题 - 缺点:执行时间较长 ### 方案 2:并发执行 - 优点:执行时间短,性能高 - 缺点:需要处理并发问题,实现复杂 ### 方案 3:批量执行 - 优点:减少数据库查询次数,性能适中 - 缺点:实现复杂度中等 ## 最终方案 采用串行执行的方式,实现简单,避免并发问题。 ## 复现步骤 1. 查看 RateLimitResetTask 的代码实现 2. 查看 DataiIntegrationObject 实体类的字段定义 3. 查看 IDataiIntegrationObjectService 接口的方法定义 4. 生成 ObjectSyncTask.java 5. 生成 ObjectInsertTask.java 6. 生成 ObjectUpdateTask.java 7. 验证代码 ## Commit Hash 待定 ## 相关文档 - [REQ-005](../requirements/REQ-005.md) - 定时任务自动同步、插入和更新对象数据需求 - [0005-scheduled-tasks-implementation.md](../decisions/adr/0005-scheduled-tasks-implementation.md) - 定时任务自动同步、插入和更新对象数据架构决策 - [005-scheduled-tasks-implementation.md](../prompts/005-scheduled-tasks-implementation.md) - 定时任务自动同步、插入和更新对象数据实现提示词