datai/docs/archive/sessions/20260116-scheduled-tasks-implementation.md

8.1 KiB
Raw Permalink Blame History

会话记录:定时任务自动同步、插入和更新对象数据

元数据 (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

使用提示词

架构决策

执行过程

现状

当前项目中已经存在 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 质疑

质疑 1targetOrgType 参数的处理

  • 问题:在 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

待定

相关文档