datai/datai-scenes/datai-scene-salesforce/docs/sessions/20260119-metadata-api-client.md
Kris 1c9f73421f docs: 完成REQ-010-5(Metadata API客户端封装)的所有6个阶段
- 阶段1:需求定义与入库 - 更新 index.md,标记 REQ-010-5 为阶段1-需求定义与入库
- 阶段2:方案决策 - 创建 ADR 文档:0014-metadata-api-client.md
- 阶段3:提示词资产化 - 创建 Prompt 文档:005-metadata-api-client.md
- 阶段4:执行会话与代码生成 - 创建会话记录:20260119-metadata-api-client.md
- 阶段5:变更记录与归档 - 创建变更记录:20260119-metadata-api-client.md
- 阶段6:闭环复盘 - 创建复盘报告:20260119-metadata-api-client-retro.md
- 更新 index.md,标记 REQ-010-5 为已完成
- 更新 CHANGELOG.md,添加 Metadata API客户端封装的变更记录

所有文档均按照SSOT方法论创建,包括需求定义、架构决策、提示词资产化、执行会话、变更记录 和闭环复盘。
2026-01-19 11:00:41 +08:00

227 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 会话记录 - Metadata API客户端封装
## 现状
REQ-010-5 需要封装 Salesforce Metadata API 客户端,提供 retrieve() 和 deploy() 方法的调用接口支持异步执行、状态轮询、Job ID 获取、Zip 文件下载、部署结果解析、错误处理机制等。
目前已经完成了需求定义、架构决策和提示词资产化阶段,现在需要开始执行会话和代码生成阶段。
## 目标
实现 Metadata API 客户端封装,包括:
1. 创建 MetadataApiClient 客户端类,封装 Salesforce Metadata API 调用
2. 实现 retrieve() 方法支持异步执行、Job ID 获取、状态轮询、Zip 文件下载
3. 实现 deploy() 方法支持异步执行、Job ID 获取、状态轮询、部署结果解析
4. 实现状态轮询机制,支持超时处理和取消操作
5. 实现 Zip 文件处理,支持大文件处理和流式处理
6. 实现部署结果解析,提取错误信息和代码覆盖率
7. 实现错误处理机制,支持异常处理和重试
8. 创建异步服务接口和实现,支持异步执行
9. 创建单元测试,确保代码质量
## 输入链接
- [REQ-010-5.md](../requirements/REQ-010-5.md) - Metadata API客户端封装需求文档
- [REQ-010-1.md](../requirements/REQ-010-1.md) - 数据库表结构设计和创建
- [REQ-010-2.md](../requirements/REQ-010-2.md) - 基础实体类和Mapper创建
- [REQ-010-3.md](../requirements/REQ-010-3.md) - Salesforce组织配置管理
- [REQ-010-4.md](../requirements/REQ-010-4.md) - 元数据任务定义管理
- [0014-metadata-api-client.md](../decisions/adr/0014-metadata-api-client.md) - Metadata API客户端封装架构决策
## Prompt 文件
- [005-metadata-api-client.md](../prompts/005-metadata-api-client.md) - Metadata API客户端封装实现提示词
## Context Snapshot
记录本次会话参考了哪些 Canvas 节点:
- [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示
- **参考节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式
- **参考节点**: [SessionManager](node_session_manager_detail) - 会话管理,提供登录服务
- **快照时间**: 2026-01-19 00:00:00
## 执行过程
详细记录本次会话的执行过程,包括:
1. **创建 MetadataApiClient 客户端类**
- 创建 MetadataApiClient 类,封装 Salesforce Metadata API 调用
- 使用 Salesforce WSC (Web Service Connector) 库
- 使用 SessionManager 进行会话管理和自动重新登录
- 使用 WSC 库的 MetadataConnection 类创建连接
- 使用 WSC 库的 RetrieveRequest 和 DeployRequest 类创建请求
- 使用 WSC 库的 AsyncResult 类处理异步结果
2. **实现 retrieve() 方法**
- 使用 Spring 的 @Async 注解实现异步执行
- 使用 ThreadPoolTaskExecutor 配置线程池
- 使用 WSC 库的 checkStatus() 方法检查任务状态
- 使用 ScheduledExecutorService 实现轮询机制
- 使用 ZipInputStream 处理 Zip 文件,使用流式处理避免内存溢出
3. **实现 deploy() 方法**
- 使用 Spring 的 @Async 注解实现异步执行
- 使用 ThreadPoolTaskExecutor 配置线程池
- 使用 WSC 库的 checkStatus() 方法检查任务状态
- 使用 ScheduledExecutorService 实现轮询机制
- 使用 Jackson 库处理 API 响应,使用正则表达式提取错误信息
4. **实现状态轮询机制**
- 使用 ScheduledExecutorService 实现定时任务
- 使用 Future 接口支持取消操作
- 使用 TimeoutException 处理超时情况
- 使用指数退避算法调整轮询频率,避免 API 限流
5. **实现 Zip 文件处理**
- 使用 ZipInputStream 处理 Zip 文件
- 使用 BufferedInputStream 提高读取性能
- 使用 ByteArrayOutputStream 临时存储文件内容
- 使用 FileOutputStream 保存文件到磁盘
6. **实现部署结果解析**
- 使用 Jackson 库的 ObjectMapper 类处理 API 响应
- 使用 JsonNode 类遍历 JSON 数据
- 使用 Pattern 和 Matcher 类提取错误信息和代码覆盖率
- 使用自定义异常类处理部署错误
7. **实现错误处理机制**
- 使用自定义异常类封装 API 调用异常
- 使用 @Retryable 注解实现重试机制
- 使用 Slf4j 记录错误信息
- 使用 GlobalExceptionHandler 统一处理异常
8. **创建异步服务接口和实现**
- 创建 IMetadataApiAsyncService 服务接口,定义异步服务接口
- 创建 MetadataApiAsyncServiceImpl 服务实现,实现异步服务
- 使用 @Async 注解实现异步执行
- 使用 CompletableFuture 支持异步结果
9. **创建单元测试**
- 创建 MetadataApiClientTest 单元测试
- 测试 retrieve() 方法
- 测试 deploy() 方法
- 使用 Mockito 模拟依赖
## 关键产出
记录本次会话的关键产出,例如:
- 生成的代码文件:
- MetadataApiClient 客户端类
- RetrieveRequest 类
- RetrieveResult 类
- DeployRequest 类
- DeployResult 类
- DeployMessage 类
- MetadataApiException 类
- AsyncConfig 配置类
- IMetadataApiAsyncService 服务接口
- MetadataApiAsyncServiceImpl 服务实现
- MetadataApiClientTest 单元测试
- 更新的文档:
-
- 解决的问题:
- 实现了 Metadata API 客户端封装
- 实现了 retrieve() 方法支持异步执行、Job ID 获取、状态轮询、Zip 文件下载
- 实现了 deploy() 方法支持异步执行、Job ID 获取、状态轮询、部署结果解析
- 实现了状态轮询机制,支持超时处理和取消操作
- 实现了 Zip 文件处理,支持大文件处理和流式处理
- 实现了部署结果解析,提取错误信息和代码覆盖率
- 实现了错误处理机制,支持异常处理和重试
- 达成的共识:
- 使用 Salesforce WSC 库创建 MetadataApiClient 客户端类
- 使用异步线程池执行长时间任务
- 使用轮询机制检查任务状态
- 使用 ZipInputStream 处理 Zip 文件
- 使用 Jackson 库处理 API 响应
- 使用统一的异常处理机制
## 质疑与替代方案
记录在执行过程中提出的质疑和考虑的替代方案:
- 质疑:是否需要使用 Salesforce REST API
- 替代方案:使用 Salesforce REST API 创建 MetadataApiClient 客户端类
- 评估REST API 功能有限,不支持所有 Metadata API 功能,需要手动处理 SOAP 协议开发成本高不支持异步调用和状态轮询。WSC 库是官方推荐的 Java 客户端库,提供了完整的 Metadata API 支持,支持异步调用和状态轮询,满足业务需求。
- 质疑:是否需要使用同步方式实现 retrieve() 和 deploy() 方法?
- 替代方案:使用同步方式实现 retrieve() 和 deploy() 方法
- 评估:同步方式会阻塞主线程,影响系统响应速度,不支持超时处理和取消操作。异步方式可以避免阻塞主线程,提高系统响应速度,支持超时处理和取消操作,满足业务需求。
- 质疑:是否需要使用消息队列实现 retrieve() 和 deploy() 方法?
- 替代方案:使用消息队列实现 retrieve() 和 deploy() 方法
- 评估:消息队列可以解耦任务提交和任务执行,支持任务持久化和重试,但消息队列增加了系统复杂度,需要引入额外的依赖。异步线程池可以满足业务需求,不需要引入额外的依赖。
- 质疑:是否需要使用回调机制实现状态轮询?
- 替代方案:使用回调机制实现状态轮询
- 评估Salesforce Metadata API 不支持回调机制,需要使用 Webhook增加系统复杂度。轮询机制可以定期检查任务状态及时获取任务进度满足业务需求。
- 质疑:是否需要使用 ZipFile 类处理 Zip 文件?
- 替代方案:使用 ZipFile 类处理 Zip 文件
- 评估ZipFile 类需要将整个 Zip 文件加载到内存可能导致内存溢出不支持大文件处理。ZipInputStream 支持流式处理,可以逐个文件处理,避免内存溢出,支持大文件处理,满足业务需求。
## 结论
总结本次会话的结果,包括:
- 完成的工作:
- 创建了 MetadataApiClient 客户端类
- 创建了 RetrieveRequest 类
- 创建了 RetrieveResult 类
- 创建了 DeployRequest 类
- 创建了 DeployResult 类
- 创建了 DeployMessage 类
- 创建了 MetadataApiException 类
- 创建了 AsyncConfig 配置类
- 创建了 IMetadataApiAsyncService 服务接口
- 创建了 MetadataApiAsyncServiceImpl 服务实现
- 创建了 MetadataApiClientTest 单元测试
- 达成的目标:
- 实现了 Metadata API 客户端封装
- 实现了 retrieve() 方法支持异步执行、Job ID 获取、状态轮询、Zip 文件下载
- 实现了 deploy() 方法支持异步执行、Job ID 获取、状态轮询、部署结果解析
- 实现了状态轮询机制,支持超时处理和取消操作
- 实现了 Zip 文件处理,支持大文件处理和流式处理
- 实现了部署结果解析,提取错误信息和代码覆盖率
- 实现了错误处理机制,支持异常处理和重试
- 后续的行动计划:
- 进行集成测试,确保功能正常
- 进行性能测试,确保性能满足要求
- 编写用户文档,说明如何使用 Metadata API 客户端
- 需要跟进的事项:
- 监控异步线程池的使用情况
- 监控状态轮询的频率
- 监控 Zip 文件处理的性能
- 监控 API 调用的成功率
## Design Update
- [x] 是否需要更新 Canvas?
- [ ] Authentication.canvas
- [ ] 其他 Canvas 文件: ____________________
## 复现步骤
提供复现本次会话结果的具体步骤:
1. 创建 MetadataApiClient 客户端类
2. 创建 RetrieveRequest 类
3. 创建 RetrieveResult 类
4. 创建 DeployRequest 类
5. 创建 DeployResult 类
6. 创建 DeployMessage 类
7. 创建 MetadataApiException 类
8. 创建 AsyncConfig 配置类
9. 创建 IMetadataApiAsyncService 服务接口
10. 创建 MetadataApiAsyncServiceImpl 服务实现
11. 创建 MetadataApiClientTest 单元测试
12. 运行单元测试,确保所有测试通过
13. 进行集成测试,确保功能正常