3.8 KiB
3.8 KiB
提示词:部署操作
输入引用
Context Maps
- Authentication.canvas - 项目架构视觉化展示
- 相关节点: Salesforce Metadata API Integration
目标
实现 Salesforce Metadata API 的通用部署功能。
核心是提供一个 deploy 服务,接收 ZIP 字节数组,调用 Salesforce 的 deploy 操作,并提供同步轮询、异步状态查询和取消部署的能力。
此服务不负责 ZIP 包的构建(由 003-02 负责),只负责 ZIP 包的传输和部署过程管理。
输出格式
-
代码文件:
MetadataDeployController.java: REST API 接口 (Spring Boot Controller)MetadataDeployService.java: 核心业务逻辑 (Spring Service)MetadataDeployRepository.java: 数据访问 (MyBatis Plus Mapper,复用 003-02)MetadataDeployEntity.java: 实体类 (复用 003-02)DeployResult.java,CancelResult.java: DTO 类MetadataConnectionFactory.java: 连接工厂 (复用)
-
测试文件:
MetadataDeployServiceTest.java: 单元测试
约束
-
技术栈:
- Spring Boot 3.x
- MyBatis Plus
- Salesforce WSC (Web Service Connector)
- Java 17+
-
架构约束:
- 接口签名:Service 的 deploy 方法必须接收
byte[] zipFile,而不是具体的 Metadata 对象(参考 ADR-003-03)。 - 同步轮询:Service 层必须实现轮询逻辑(提交 -> 循环 checkStatus -> 返回最终结果),以简化前端调用(参考 ADR-003-02)。
- 异常处理:必须捕获 WSC 的
ConnectionException并转换为自定义运行时异常SalesforceOperationException。
- 接口签名:Service 的 deploy 方法必须接收
-
代码规范:
- 遵循 Google Java Style Guide。
- 使用 Lombok
@Data,@Slf4j等注解。 - REST API 必须返回统一的
ApiResponse<T>结构。
Rule Set
-
部署流程:
- Controller 接收
MultipartFile-> 获取byte[]-> 调用 Service。 - Service 调用
connection.deploy(zipFile, deployOptions)-> 获取AsyncResult。 - Service 立即保存
Queued状态到数据库。 - Service 进入轮询循环(默认每 1 秒查一次,最多查 60 次,可配置)。
- 轮询结束或超时后,更新数据库状态,并返回最终的
DeployResult。
- Controller 接收
-
状态同步:
- 在
checkDeployStatus时,如果 Salesforce 返回的状态(Done,Succeeded,Failed)与数据库不一致,必须更新数据库。
- 在
-
JSON 解析:
deployOptions参数通过 JSON 字符串传递,需使用 JacksonObjectMapper解析为com.sforce.soap.metadata.DeployOptions。- 必须设置默认值:
rollbackOnError = true,singlePackage = true。
验收标准
-
功能完整性:
- 能成功接收并部署 ZIP 文件。
- 能轮询直到部署完成(成功或失败)。
- 能通过 ID 查询部署状态。
- 能取消正在进行的部署。
-
代码质量:
- Service 层不依赖具体的 Metadata 子类。
- 异常处理完善,无未捕获的受检异常。
- 单元测试覆盖率 > 80%。
风险
- 大文件上传:ZIP 文件过大可能导致 OOM 或上传超时。需在 Controller 配置
MultipartFile大小限制(如 50MB)。 - 轮询超时:Salesforce 部署可能非常慢。需在 Service 中设置合理的轮询上限,避免线程卡死。