- 新增 4 个定时任务类: - ObjectSyncTask: 对象自动同步任务 - ObjectInsertTask: 对象自动插入任务 - ObjectUpdateTask: 对象自动更新任务 - MetadataChangeAutoSyncTask: 元数据变更自动同步任务 - 新增 2 个多对象操作接口: - insertMultipleObjectDataToTarget: 批量插入对象数据到目标系统 - updateMultipleObjectDataToTarget: 批量更新对象数据到目标系统 - 新增完整的定时任务文档: - task/index.md: 定时任务文档索引 - ObjectSyncTask.md: 对象自动同步任务文档 - ObjectInsertTask.md: 对象自动插入任务文档 - ObjectUpdateTask.md: 对象自动更新任务文档 - MetadataChangeAutoSyncTask.md: 元数据变更自动同步任务文档 - RateLimitResetTask.md: 每日限流重置任务文档 - 新增 API 文档索引:api-docs/index.md - 更新唯一真源文档中心:docs/index.md - 新增完整的项目文档: - REQ-005.md: 定时任务自动同步、插入和更新对象数据需求 - REQ-006.md: 元数据变更自动同步本地数据库需求 - 0005-scheduled-tasks-implementation.md: 定时任务架构决策 - 0006-metadata-change-auto-sync.md: 元数据变更自动同步架构决策 - 005-scheduled-tasks-implementation.md: 定时任务实现提示词 - 006-metadata-change-auto-sync.md: 元数据变更自动同步实现提示词 - 20260116-scheduled-tasks-implementation.md: 定时任务实现会话记录 - 20260116-metadata-change-auto-sync.md: 元数据变更自动同步实现会话记录 - 20260116-scheduled-tasks-implementation-retro.md: 定时任务实现复盘 - 20260116-metadata-change-auto-sync-retro.md: 元数据变更自动同步实现复盘 - 0015-scheduled-tasks-implementation.md: 定时任务变更记录 - 0016-metadata-change-auto-sync.md: 元数据变更自动同步变更记录 - 更新 CHANGELOG.md 和 README.md
8.1 KiB
8.1 KiB
会话记录:定时任务自动同步、插入和更新对象数据
元数据 (Metadata)
- 会话编号: SESSION-20260116-005
- 会话标题: 定时任务自动同步、插入和更新对象数据实现
- 触发需求: REQ-005
- 创建日期: 2026-01-16
- 开始时间: 2026-01-16 14:00:00
- 结束时间: 2026-01-16 15:00:00
- 执行人: AI Assistant
- 状态: Completed
触发原因
用户需要实现定时任务自动同步、插入和更新对象数据功能,具体需求详见 REQ-005。
使用提示词
- 005-scheduled-tasks-implementation.md - 定时任务自动同步、插入和更新对象数据实现提示词
架构决策
- 0005-scheduled-tasks-implementation.md - 定时任务自动同步、插入和更新对象数据架构决策
执行过程
现状
当前项目中已经存在 datai-quartz 模块,提供了完整的定时任务管理功能。项目中已经有 RateLimitResetTask 这样的定时任务实现,可以作为参考。
需要实现的功能:
- 在 task 目录下创建三个定时任务类
- 参考 RateLimitResetTask 的写法
- 实现对象自动同步任务
- 实现对象自动插入任务
- 实现对象自动更新任务
目标
生成三个定时任务类的完整代码:
- ObjectSyncTask.java - 对象自动同步任务
- ObjectInsertTask.java - 对象自动插入任务
- 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.javad:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\task\ObjectInsertTask.javad:\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
代码特点
-
参考 RateLimitResetTask 的代码风格:
- 使用 @Component 注解,指定 bean 名称
- 使用 @Slf4j 注解进行日志记录
- 使用 @Autowired 注入 IDataiIntegrationObjectService
- 定义公共方法作为定时任务的执行方法
- 方法内部有 try-catch 异常处理
- 记录详细的日志信息
-
完善的日志记录:
- 开始执行时记录日志
- 每个对象操作前记录日志
- 每个对象操作成功后记录日志
- 每个对象操作失败时记录错误日志
- 任务完成时记录统计信息
-
完善的异常处理:
- 外层 try-catch 处理任务级别的异常
- 内层 try-catch 处理单个对象级别的异常
- 单个对象操作失败不影响其他对象的处理
-
灵活的参数设计:
- ObjectInsertTask 和 ObjectUpdateTask 提供了两个方法:
- autoInsertObjects() / autoUpdateObjects():使用默认目标ORG类型
- autoInsertObjects(String targetOrgType) / autoUpdateObjects(String targetOrgType):自定义目标ORG类型
- ObjectInsertTask 和 ObjectUpdateTask 提供了两个方法:
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:批量执行
- 优点:减少数据库查询次数,性能适中
- 缺点:实现复杂度中等
最终方案
采用串行执行的方式,实现简单,避免并发问题。
复现步骤
- 查看 RateLimitResetTask 的代码实现
- 查看 DataiIntegrationObject 实体类的字段定义
- 查看 IDataiIntegrationObjectService 接口的方法定义
- 生成 ObjectSyncTask.java
- 生成 ObjectInsertTask.java
- 生成 ObjectUpdateTask.java
- 验证代码
Commit Hash
待定
相关文档
- REQ-005 - 定时任务自动同步、插入和更新对象数据需求
- 0005-scheduled-tasks-implementation.md - 定时任务自动同步、插入和更新对象数据架构决策
- 005-scheduled-tasks-implementation.md - 定时任务自动同步、插入和更新对象数据实现提示词