10 KiB
会话记录:003-04 异步操作
元数据
- 需求编号: 003-04
- 需求名称: 异步操作
- 会话开始时间: 2026-02-06
- 会话结束时间: 2026-02-06
- 当前阶段: 阶段 9:闭环复盘和接口文档
- 状态: 已完成
需求描述
实现 Metadata API 异步操作管理模块,包括:
- 异步操作状态查询(checkStatus)
- 服务端同步轮询(poll)
- 异步操作取消(cancel)
- 操作历史记录
本需求是 003(Metadata API 管理)模块的重要组成部分,为部署操作(003-03)和其他异步操作提供状态管理能力。
执行阶段
阶段 1:需求定义与入库
- 状态: 已完成(前置阶段)
- 生成文档: 需求文档
- 关键决策:
- 确定需求范围:异步操作状态查询、轮询、取消、历史记录
- 确定轮询策略:由 ADR-003-04 决策(服务端同步轮询)
- 确定权限模型:查询权限和取消权限分离
阶段 2:方案设计
- 状态: 已完成(前置阶段)
- 生成文档: 设计文档
- 关键决策:
- 复用现有的
datai_metadata_async表结构 - Service 层设计 5 个核心方法
- Controller 提供 5 个 REST API 接口
- 使用 VO 类封装响应数据
- 复用现有的
阶段 3:方案决策
- 状态: 已完成(前置阶段)
- 生成文档: 决策记录
- 关键决策:
- 选择服务端同步轮询:简单可靠,实现成本低,简化上层业务代码
- 拒绝客户端轮询:增加前端复杂度,需要处理网络异常和超时
- 拒绝 WebSocket:实现复杂度高,Salesforce 不支持
- 轮询参数:默认间隔 5 秒,超时 5 分钟
阶段 4:数据库结构生成
- 状态: 跳过(复用现有表)
- 说明: 复用已有的
datai_metadata_async表,无需新建表
阶段 5:提示词生成
- 状态: 已完成(前置阶段)
- 生成文档: 提示词文档
阶段 6:执行代码生成
- 状态: 已完成
- 生成代码文件:
1. Service 接口
- 文件:
IMetadataAsyncService.java - 路径:
com.datai.metadata.service - 方法:
getAsyncResult(String asyncId): 获取异步操作结果pollAsyncResult(String asyncId, long interval, long timeout): 轮询异步操作状态cancelAsyncResult(String asyncId): 取消异步操作getAsyncHistory(int limit): 获取异步操作历史selectByAsyncId(String asyncId): 根据 asyncId 查询记录
2. Service 实现
- 文件:
MetadataAsyncServiceImpl.java - 路径:
com.datai.metadata.service.impl - 核心功能:
- 调用 Salesforce Metadata API 查询异步状态
- 服务端同步轮询策略(根据 ADR-003-04)
- 数据库持久化操作记录
- 异常转换和处理
3. Controller
- 文件:
MetadataAsyncController.java - 路径:
com.datai.metadata.controller - API 接口:
GET /salesforce/metadata/async/status/{asyncId}: 获取异步操作状态GET /salesforce/metadata/async/poll/{asyncId}: 同步轮询POST /salesforce/metadata/async/cancel/{asyncId}: 取消异步操作GET /salesforce/metadata/async/history: 获取历史记录GET /salesforce/metadata/async/record/{asyncId}: 查询本地记录
4. VO 类
-
文件:
AsyncResultVo.java -
路径:
com.datai.metadata.model.vo -
字段: id, done, message, state, checkTime
-
文件:
CancelResultVo.java -
路径:
com.datai.metadata.model.vo -
字段: asyncId, success, cancelTime, message
5. Mapper 扩展
- 文件:
DataiMetadataAsyncMapper.java - 新增方法:
selectByAsyncId(String asyncId): 根据 asyncId 查询selectRecentAsyncHistory(int limit): 查询最近历史
阶段 7:记录当前会话
- 状态: 已完成
- 生成文档: 会话记录
- 关键决策: 完整记录会话过程,包括对话记录、生成的文档和代码
阶段 8:变更记录与归档
- 状态: 已完成
- 生成文档: 变更日志
- 关键决策:
- 创建详细的变更日志,包含新增功能、接口、代码文件、影响范围
- 更新根目录 CHANGELOG.md
- 更新索引和需求文档
- 变更内容:
- 新增 5 个 REST API 接口
- 新增 5 个代码文件(2 个 VO + 1 个 Service 接口 + 1 个 Service 实现 + 1 个 Controller)
- 修改 1 个文件(DataiMetadataAsyncMapper.java)
- 新增 2 个权限点
对话记录
2026-02-06 会话开始
用户: 进入阶段 6(代码生成)
AI: 好的,进入阶段 6:代码生成。我将根据设计文档和决策记录,生成 003-04 异步操作功能的代码。
AI: 首先让我检查现有的代码结构和相关文件...
AI: 我注意到项目中已经存在一些异步操作相关的代码。让我检查现有的实现,然后根据设计文档进行完善。
AI: 我看到已经存在基础的异步操作日志管理代码,但缺少与 Salesforce Metadata API 交互的核心功能。让我查看现有的 VO 和 DTO 类,然后根据设计文档创建缺失的 Service 接口和实现。
AI: 现在让我创建任务列表,然后按照设计文档实现缺失的核心功能。
代码生成过程
AI: 现在创建 MetadataAsyncService 接口和实现...
AI: 现在创建 AsyncResultVo 和 CancelResultVo...
AI: 现在创建 MetadataAsyncServiceImpl 实现类...
AI: 现在需要检查 Mapper 中是否有需要的方法...
AI: 我需要在 Mapper 中添加两个新方法。让我更新 Mapper 接口...
AI: 现在创建 MetadataAsyncController 控制器...
会话结束确认
AI: ## 003-04 异步操作 - 代码生成阶段已完成!
AI: ### 已生成的代码文件 ...
AI: 代码生成是否完整?是否进入下一阶段(阶段 7:会话记录归档)?
用户: 进入下一阶段(阶段 7:会话记录归档)
AI: 好的,我将按照阶段 7 的技能书执行会话记录归档...
关键决策引用
ADR-003-04: 异步操作轮询策略
- 决策: 使用服务端同步轮询 (Server-side Synchronous Polling)
- 理由:
- 简单可靠,实现成本低
- 简化上层业务代码
- 服务端统一控制超时和重试
- 实现:
MetadataAsyncServiceImpl.pollAsyncResult()
技术实现要点
1. 服务端同步轮询
public AsyncResultVo pollAsyncResult(String asyncId, long interval, long timeout) {
long startTime = System.currentTimeMillis();
while (true) {
AsyncResultVo result = getAsyncResult(asyncId);
if (result.isDone()) {
return result;
}
if (System.currentTimeMillis() - startTime > timeout) {
throw new SalesforceOperationException("异步操作轮询超时");
}
Thread.sleep(interval);
}
}
2. 异常转换规则
InvalidSessionId/Session expired→SalesforceAuthExceptionUnauthorized→SalesforceAuthExceptionInvalidAsyncId→SalesforceOperationException- 其他 →
SalesforceOperationException
3. 数据库持久化
- 每次状态查询都记录到
datai_metadata_async表 - 支持插入新记录或更新现有记录
- 记录创建人和更新人
权限配置
| 接口 | 权限 |
|---|---|
| GET /status/{asyncId} | salesforce:metadata:async:query |
| GET /poll/{asyncId} | salesforce:metadata:async:query |
| POST /cancel/{asyncId} | salesforce:metadata:async:cancel |
| GET /history | salesforce:metadata:async:query |
| GET /record/{asyncId} | salesforce:metadata:async:query |
代码统计
-
新增文件: 5 个
- IMetadataAsyncService.java
- MetadataAsyncServiceImpl.java
- MetadataAsyncController.java
- AsyncResultVo.java
- CancelResultVo.java
-
修改文件: 1 个
- DataiMetadataAsyncMapper.java(添加 2 个方法)
-
代码行数: 约 600 行
生成的文档
生成的代码文件
datai-salesforce-metadata/src/main/java/com/datai/metadata/service/IMetadataAsyncService.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/service/impl/MetadataAsyncServiceImpl.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/controller/MetadataAsyncController.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/AsyncResultVo.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/CancelResultVo.javadatai-salesforce-metadata/src/main/java/com/datai/metadata/mapper/DataiMetadataAsyncMapper.java(修改)
阶段 9:闭环复盘和接口文档
- 状态: 已完成
- 生成文档:
- 关键决策:
- 复盘文档包含 5 条成功经验、4 个改进点、2 个问题分析、4 条行动计划
- 提取了 3 条有效的 Prompt 技巧和 3 个避免的坑
- 提出了 4 项模板迭代建议
- API 文档包含 5 个接口的详细说明、请求/响应参数、示例、错误码
- 复盘主要结论:
- 复用现有代码和表结构的策略成功,减少了开发工作量
- 清晰的 ADR 决策指导了代码实现
- 需要改进:Mapper XML 的 SQL 实现可以同步完成、单元测试可以同步生成
- 问题:代码生成时未同步检查依赖项、权限配置未同步完成
下一步行动
- Mapper XML: 添加
selectByAsyncId和selectRecentAsyncHistory的 SQL 实现 - 单元测试: 编写 Service 和 Controller 的单元测试
- 集成测试: 与 Salesforce 环境进行集成测试
- 进入阶段 10: 代码提交
回退记录
无