212 lines
8.1 KiB
Markdown
212 lines
8.1 KiB
Markdown
# 会话记录:定时任务自动同步、插入和更新对象数据
|
||
|
||
## 元数据 (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) - 定时任务自动同步、插入和更新对象数据实现提示词
|