295 lines
10 KiB
Markdown
295 lines
10 KiB
Markdown
# 会话记录:003-04 异步操作
|
||
|
||
## 元数据
|
||
- **需求编号**: 003-04
|
||
- **需求名称**: 异步操作
|
||
- **会话开始时间**: 2026-02-06
|
||
- **会话结束时间**: 2026-02-06
|
||
- **当前阶段**: 阶段 9:闭环复盘和接口文档
|
||
- **状态**: 已完成
|
||
|
||
---
|
||
|
||
## 需求描述
|
||
实现 Metadata API 异步操作管理模块,包括:
|
||
- 异步操作状态查询(checkStatus)
|
||
- 服务端同步轮询(poll)
|
||
- 异步操作取消(cancel)
|
||
- 操作历史记录
|
||
|
||
本需求是 003(Metadata API 管理)模块的重要组成部分,为部署操作(003-03)和其他异步操作提供状态管理能力。
|
||
|
||
---
|
||
|
||
## 执行阶段
|
||
|
||
### 阶段 1:需求定义与入库
|
||
- **状态**: 已完成(前置阶段)
|
||
- **生成文档**: [需求文档](../requirements/sub/2026-01-28-003-04-异步操作.md)
|
||
- **关键决策**:
|
||
- 确定需求范围:异步操作状态查询、轮询、取消、历史记录
|
||
- 确定轮询策略:由 ADR-003-04 决策(服务端同步轮询)
|
||
- 确定权限模型:查询权限和取消权限分离
|
||
|
||
### 阶段 2:方案设计
|
||
- **状态**: 已完成(前置阶段)
|
||
- **生成文档**: [设计文档](../design/2026-02-03-003-04-异步操作-设计.md)
|
||
- **关键决策**:
|
||
- 复用现有的 `datai_metadata_async` 表结构
|
||
- Service 层设计 5 个核心方法
|
||
- Controller 提供 5 个 REST API 接口
|
||
- 使用 VO 类封装响应数据
|
||
|
||
### 阶段 3:方案决策
|
||
- **状态**: 已完成(前置阶段)
|
||
- **生成文档**: [决策记录](../decisions/2026-02-03-003-04-ADR-异步操作轮询策略.md)
|
||
- **关键决策**:
|
||
- **选择服务端同步轮询**:简单可靠,实现成本低,简化上层业务代码
|
||
- **拒绝客户端轮询**:增加前端复杂度,需要处理网络异常和超时
|
||
- **拒绝 WebSocket**:实现复杂度高,Salesforce 不支持
|
||
- **轮询参数**:默认间隔 5 秒,超时 5 分钟
|
||
|
||
### 阶段 4:数据库结构生成
|
||
- **状态**: 跳过(复用现有表)
|
||
- **说明**: 复用已有的 `datai_metadata_async` 表,无需新建表
|
||
|
||
### 阶段 5:提示词生成
|
||
- **状态**: 已完成(前置阶段)
|
||
- **生成文档**: [提示词文档](../prompts/2026-02-03-003-04-prompt-异步操作.md)
|
||
|
||
### 阶段 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:记录当前会话
|
||
- **状态**: 已完成
|
||
- **生成文档**: [会话记录](./2026-02-06-003-04-session.md)
|
||
- **关键决策**: 完整记录会话过程,包括对话记录、生成的文档和代码
|
||
|
||
### 阶段 8:变更记录与归档
|
||
- **状态**: 已完成
|
||
- **生成文档**: [变更日志](../changelog/2026-02-06-003-04-changelog.md)
|
||
- **关键决策**:
|
||
- 创建详细的变更日志,包含新增功能、接口、代码文件、影响范围
|
||
- 更新根目录 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)
|
||
- **理由**:
|
||
1. 简单可靠,实现成本低
|
||
2. 简化上层业务代码
|
||
3. 服务端统一控制超时和重试
|
||
- **实现**: `MetadataAsyncServiceImpl.pollAsyncResult()`
|
||
|
||
---
|
||
|
||
## 技术实现要点
|
||
|
||
### 1. 服务端同步轮询
|
||
```java
|
||
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` → `SalesforceAuthException`
|
||
- `Unauthorized` → `SalesforceAuthException`
|
||
- `InvalidAsyncId` → `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 行
|
||
|
||
---
|
||
|
||
## 生成的文档
|
||
|
||
- [需求文档](../requirements/sub/2026-01-28-003-04-异步操作.md)
|
||
- [设计文档](../design/2026-02-03-003-04-异步操作-设计.md)
|
||
- [决策记录](../decisions/2026-02-03-003-04-ADR-异步操作轮询策略.md)
|
||
- [提示词文档](../prompts/2026-02-03-003-04-prompt-异步操作.md)
|
||
- [会话记录](./2026-02-06-003-04-session.md)
|
||
- [变更日志](../changelog/2026-02-06-003-04-changelog.md)
|
||
- [复盘文档](../retros/2026-02-06-003-04-retro.md)
|
||
- [API 文档](../api-docs/2026-02-06-003-04-api.md)
|
||
|
||
## 生成的代码文件
|
||
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/service/IMetadataAsyncService.java`
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/service/impl/MetadataAsyncServiceImpl.java`
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/controller/MetadataAsyncController.java`
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/AsyncResultVo.java`
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/CancelResultVo.java`
|
||
- `datai-salesforce-metadata/src/main/java/com/datai/metadata/mapper/DataiMetadataAsyncMapper.java`(修改)
|
||
|
||
### 阶段 9:闭环复盘和接口文档
|
||
- **状态**: 已完成
|
||
- **生成文档**:
|
||
- [复盘文档](../retros/2026-02-06-003-04-retro.md)
|
||
- [API 文档](../api-docs/2026-02-06-003-04-api.md)
|
||
- **关键决策**:
|
||
- 复盘文档包含 5 条成功经验、4 个改进点、2 个问题分析、4 条行动计划
|
||
- 提取了 3 条有效的 Prompt 技巧和 3 个避免的坑
|
||
- 提出了 4 项模板迭代建议
|
||
- API 文档包含 5 个接口的详细说明、请求/响应参数、示例、错误码
|
||
- **复盘主要结论**:
|
||
- 复用现有代码和表结构的策略成功,减少了开发工作量
|
||
- 清晰的 ADR 决策指导了代码实现
|
||
- 需要改进:Mapper XML 的 SQL 实现可以同步完成、单元测试可以同步生成
|
||
- 问题:代码生成时未同步检查依赖项、权限配置未同步完成
|
||
|
||
---
|
||
|
||
## 下一步行动
|
||
|
||
1. **Mapper XML**: 添加 `selectByAsyncId` 和 `selectRecentAsyncHistory` 的 SQL 实现
|
||
2. **单元测试**: 编写 Service 和 Controller 的单元测试
|
||
3. **集成测试**: 与 Salesforce 环境进行集成测试
|
||
4. **进入阶段 10**: 代码提交
|
||
|
||
---
|
||
|
||
## 回退记录
|
||
|
||
无
|