- 阶段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方法论创建,包括需求定义、架构决策、提示词资产化、执行会话、变更记录 和闭环复盘。
227 lines
10 KiB
Markdown
227 lines
10 KiB
Markdown
# 会话记录 - 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. 进行集成测试,确保功能正常
|