257 lines
11 KiB
Markdown
257 lines
11 KiB
Markdown
# 架构决策记录 - 元数据任务定义管理
|
||
|
||
## 背景
|
||
|
||
REQ-010-4 需要实现元数据任务定义的完整管理功能,包括:
|
||
1. 任务定义 CRUD 功能 - 支持分页查询、条件查询
|
||
2. package.xml 内容配置 - 支持可视化编辑,符合 Salesforce Metadata API 规范
|
||
3. API 版本选择 - 支持多种 API 版本
|
||
4. 调度类型选择 - 支持 Manual/Cron 调度类型
|
||
5. Cron 表达式配置 - 支持 Cron 表达式配置和验证
|
||
6. 任务验证功能 - 验证 package.xml 和调度配置
|
||
|
||
这些功能需要基于现有的 Spring Boot 3 + Vue 3 技术栈,遵循 Authentication.canvas 中定义的架构和调用关系,使用 MyBatis Plus 作为持久层框架。
|
||
|
||
## 决策
|
||
|
||
### 1. 任务定义 CRUD 功能方案
|
||
|
||
**决策**: 使用 MyBatis Plus 的 BaseMapper 实现 CRUD,使用 @Valid 注解进行参数验证,使用 RESTful API 设计接口。
|
||
|
||
**理由**:
|
||
- MyBatis Plus 的 BaseMapper 提供了基础的 CRUD 方法,简化了开发
|
||
- @Valid 注解可以自动验证参数,提高代码质量和安全性
|
||
- RESTful API 设计符合业界标准,易于使用和扩展
|
||
- 支持分页查询和条件查询,满足业务需求
|
||
|
||
**实现方案**:
|
||
- 使用 MyBatis Plus 的 BaseMapper 提供基础的 CRUD 方法
|
||
- 使用 @Valid 注解进行参数验证
|
||
- 使用 RESTful API 设计接口,包括 GET、POST、PUT、DELETE 方法
|
||
- 使用 MyBatis Plus 的 QueryWrapper 实现条件查询
|
||
- 使用 MyBatis Plus 的分页插件实现分页查询
|
||
|
||
### 2. package.xml 内容配置方案
|
||
|
||
**决策**: 使用 DOM 解析器处理 package.xml,实现可视化编辑器,支持多种元数据类型配置和通配符配置。
|
||
|
||
**理由**:
|
||
- DOM 解析器是 Java 标准库的一部分,无需引入额外依赖
|
||
- DOM 解析器可以灵活处理 XML 文件,支持增删改查操作
|
||
- 可视化编辑器可以提高用户体验,降低使用门槛
|
||
- 支持多种元数据类型配置和通配符配置,满足业务需求
|
||
|
||
**实现方案**:
|
||
- 使用 Java DOM 解析器处理 package.xml
|
||
- 创建 PackageXmlEditor 类,提供 package.xml 编辑功能
|
||
- 实现可视化编辑器,支持元数据类型选择和通配符配置
|
||
- 实现 package.xml 验证功能,验证 package.xml 格式是否符合 Salesforce Metadata API 规范
|
||
- 实现 package.xml 预览功能,显示 package.xml 内容
|
||
|
||
### 3. API 版本选择方案
|
||
|
||
**决策**: 使用枚举类型管理 API 版本,使用配置文件管理支持的 API 版本列表。
|
||
|
||
**理由**:
|
||
- 枚举类型可以提供类型安全,避免使用魔法值
|
||
- 配置文件可以灵活管理支持的 API 版本列表,便于维护
|
||
- 枚举类型可以提供友好的显示名称,提高用户体验
|
||
|
||
**实现方案**:
|
||
- 创建 ApiVersion 枚举类,包含支持的 API 版本
|
||
- 使用配置文件管理支持的 API 版本列表
|
||
- 提供 getDisplayName() 方法,返回友好的显示名称
|
||
- 提供 fromVersion() 方法,根据版本号转换为枚举类型
|
||
|
||
### 4. 调度类型选择方案
|
||
|
||
**决策**: 使用 Java 枚举类型管理调度类型,使用 @EnumValue 注解映射数据库值。
|
||
|
||
**理由**:
|
||
- Java 枚举类型可以提供类型安全,避免使用魔法值
|
||
- @EnumValue 注解可以自动映射枚举值和数据库值
|
||
- 枚举类型可以提供友好的显示名称,提高用户体验
|
||
|
||
**实现方案**:
|
||
- 创建 ScheduleType 枚举类,包含 MANUAL 和 CRON 两个值
|
||
- 使用 @EnumValue 注解映射枚举值和数据库值
|
||
- 提供 getDisplayName() 方法,返回友好的显示名称
|
||
- 提供 fromCode() 方法,根据数据库值转换为枚举类型
|
||
|
||
### 5. Cron 表达式配置方案
|
||
|
||
**决策**: 使用 Cron 表达式解析库验证 Cron 表达式,实现 Cron 表达式预览功能。
|
||
|
||
**理由**:
|
||
- Cron 表达式解析库可以准确验证 Cron 表达式,避免验证错误
|
||
- Cron 表达式预览功能可以提高用户体验,帮助用户理解 Cron 表达式
|
||
- Cron 表达式解析库支持多种 Cron 表达式格式,提高兼容性
|
||
|
||
**实现方案**:
|
||
- 使用 Cron 表达式解析库验证 Cron 表达式
|
||
- 创建 CronExpressionValidator 类,提供 Cron 表达式验证功能
|
||
- 实现 Cron 表达式预览功能,显示 Cron 表达式的执行时间
|
||
- 提供详细的验证错误信息,包括错误类型和错误位置
|
||
|
||
### 6. 任务验证功能方案
|
||
|
||
**决策**: 使用 DOM 解析器验证 package.xml,使用 Cron 表达式解析库验证 Cron 表达式,提供详细的验证错误信息。
|
||
|
||
**理由**:
|
||
- DOM 解析器可以准确验证 package.xml 格式,避免验证错误
|
||
- Cron 表达式解析库可以准确验证 Cron 表达式,避免验证错误
|
||
- 详细的验证错误信息可以帮助用户快速定位和解决问题
|
||
|
||
**实现方案**:
|
||
- 使用 DOM 解析器验证 package.xml 格式
|
||
- 使用 Cron 表达式解析库验证 Cron 表达式
|
||
- 创建 TaskValidator 类,提供任务验证功能
|
||
- 提供详细的验证错误信息,包括错误类型和错误位置
|
||
|
||
## 备选方案
|
||
|
||
### 1. package.xml 内容配置备选方案
|
||
|
||
**方案 A**: 使用 SAX 解析器处理 package.xml
|
||
- 优点: SAX 解析器内存占用低,适合处理大文件
|
||
- 缺点: SAX 解析器不支持随机访问,不适合编辑操作
|
||
- 不选择原因: package.xml 文件较小,DOM 解析器足够,DOM 解析器支持随机访问,适合编辑操作
|
||
|
||
**方案 B**: 使用 StAX 解析器处理 package.xml
|
||
- 优点: StAX 解析器内存占用低,支持流式处理
|
||
- 缺点: StAX 解析器不支持随机访问,不适合编辑操作
|
||
- 不选择原因: package.xml 文件较小,DOM 解析器足够,DOM 解析器支持随机访问,适合编辑操作
|
||
|
||
### 2. Cron 表达式配置备选方案
|
||
|
||
**方案 A**: 使用正则表达式验证 Cron 表达式
|
||
- 优点: 正则表达式可以灵活验证 Cron 表达式
|
||
- 缺点: 正则表达式验证不准确,可能验证错误的 Cron 表达式
|
||
- 不选择原因: Cron 表达式解析库可以准确验证 Cron 表达式,避免验证错误
|
||
|
||
**方案 B**: 使用自定义 Cron 表达式解析器
|
||
- 优点: 自定义 Cron 表达式解析器可以灵活定制功能
|
||
- 缺点: 自定义 Cron 表达式解析器开发成本高,维护成本高
|
||
- 不选择原因: Cron 表达式解析库已经足够,无需自定义
|
||
|
||
## 影响
|
||
|
||
### 系统架构影响
|
||
|
||
- 新增 PackageXmlEditor 类,提供 package.xml 编辑功能
|
||
- 新增 ApiVersion 枚举类,管理 API 版本
|
||
- 新增 ScheduleType 枚举类,管理调度类型
|
||
- 新增 CronExpressionValidator 类,提供 Cron 表达式验证功能
|
||
- 新增 TaskValidator 类,提供任务验证功能
|
||
- 新增 MetadataTaskController 控制器,提供 RESTful API 接口
|
||
- 新增 IMetadataTaskService 服务接口,定义元数据任务服务接口
|
||
- 新增 MetadataTaskServiceImpl 服务实现,实现元数据任务服务
|
||
- 新增 IPackageXmlService 服务接口,定义 package.xml 服务接口
|
||
- 新增 PackageXmlServiceImpl 服务实现,实现 package.xml 服务
|
||
- 新增 ITaskValidationService 服务接口,定义任务验证服务接口
|
||
- 新增 TaskValidationServiceImpl 服务实现,实现任务验证服务
|
||
|
||
### 开发流程影响
|
||
|
||
- 需要编写单元测试,测试 package.xml 编辑功能
|
||
- 需要编写单元测试,测试 Cron 表达式验证功能
|
||
- 需要编写单元测试,测试任务验证功能
|
||
- 需要编写集成测试,测试元数据任务 CRUD 功能
|
||
- 需要编写集成测试,测试任务验证功能
|
||
|
||
### 运维管理影响
|
||
|
||
- 需要在配置文件中配置支持的 API 版本列表
|
||
- 需要定期更新支持的 API 版本列表,确保兼容性
|
||
- 需要监控任务执行情况,及时发现任务问题
|
||
- 需要定期清理无效的任务,避免任务过多
|
||
|
||
## 风险
|
||
|
||
### 技术风险
|
||
|
||
- **package.xml 验证风险**: package.xml 格式验证复杂可能导致验证不准确
|
||
- 缓解措施: 使用 DOM 解析器验证 package.xml,编写详细的单元测试,覆盖各种验证场景
|
||
|
||
- **Cron 表达式解析风险**: Cron 表达式解析错误可能导致任务调度失败
|
||
- 缓解措施: 使用 Cron 表达式解析库验证 Cron 表达式,编写详细的单元测试,覆盖各种验证场景
|
||
|
||
- **任务验证风险**: 任务验证逻辑复杂可能导致验证不准确
|
||
- 缓解措施: 编写详细的单元测试,覆盖各种验证场景,定期审查验证逻辑
|
||
|
||
### 业务风险
|
||
|
||
- **多任务管理风险**: 多任务管理复杂可能导致任务冲突
|
||
- 缓解措施: 提供清晰的任务管理界面,支持任务分组和标签,定期清理无效任务
|
||
|
||
- **任务调度风险**: 任务调度不当可能导致任务执行失败
|
||
- 缓解措施: 提供任务预览功能,帮助用户理解任务调度,提供任务执行日志
|
||
|
||
### 实施风险
|
||
|
||
- **开发周期延长风险**: 功能复杂可能导致开发周期延长
|
||
- 缓解措施: 分阶段实施,优先实现核心功能,逐步完善辅助功能
|
||
|
||
## 回滚策略
|
||
|
||
如果决策实施后出现问题,可以采取以下回滚策略:
|
||
|
||
1. **package.xml 配置功能回滚**: 如果 package.xml 配置功能出现问题,可以暂时关闭 package.xml 配置功能,使用文本编辑器编辑 package.xml,待问题解决后再启用 package.xml 配置功能
|
||
|
||
2. **Cron 表达式配置功能回滚**: 如果 Cron 表达式配置功能出现问题,可以暂时关闭 Cron 表达式配置功能,使用固定时间调度,待问题解决后再启用 Cron 表达式配置功能
|
||
|
||
3. **任务验证功能回滚**: 如果任务验证功能出现问题,可以暂时关闭任务验证功能,待问题解决后再启用任务验证功能
|
||
|
||
4. **整体回滚**: 如果整个功能出现问题,可以删除新增的代码和文档,恢复到功能实现前的状态
|
||
|
||
## 验收标准
|
||
|
||
### 功能验收标准
|
||
|
||
- 任务定义 CRUD 功能正常工作,能够成功创建、编辑、删除、查询元数据任务
|
||
- package.xml 内容配置正常工作,能够正确配置和验证 package.xml
|
||
- API 版本选择正常工作,能够正确选择和显示 API 版本
|
||
- 调度类型选择正常工作,能够正确选择和显示调度类型
|
||
- Cron 表达式配置正常工作,能够正确配置和验证 Cron 表达式
|
||
- 任务验证功能正常工作,能够正确验证 package.xml 和调度配置
|
||
|
||
### 代码质量验收标准
|
||
|
||
- 代码符合项目编码规范,有清晰的注释
|
||
- 单元测试覆盖率不低于 80%
|
||
- 集成测试覆盖率不低于 60%
|
||
- 代码审查通过,没有严重的问题
|
||
|
||
### 性能验收标准
|
||
|
||
- 元数据任务 CRUD 操作响应时间不超过 500ms
|
||
- package.xml 配置操作响应时间不超过 1s
|
||
- Cron 表达式验证操作响应时间不超过 500ms
|
||
- 任务验证操作响应时间不超过 1s
|
||
|
||
## 视觉锚点
|
||
|
||
### Visual Reference
|
||
|
||
引用 Canvas 的具体节点或快照:
|
||
- [Authentication.canvas](../../Authentication.canvas) - 相关架构图
|
||
- **具体节点**: [集成任务](node_integration_task) - 处理Salesforce的定时同步任务
|
||
|
||
### Status
|
||
|
||
- [x] Draft
|
||
- [ ] Accepted
|
||
- [ ] Superceded
|
||
|
||
## 参考资料
|
||
|
||
列出与该决策相关的参考资料,包括文档、文章或其他资源:
|
||
|
||
- [REQ-010-4.md](../../requirements/REQ-010-4.md) - 元数据任务定义管理需求文档
|
||
- [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组织配置管理
|
||
- [Authentication.canvas](../../Authentication.canvas) - 项目架构视觉化展示
|
||
- [MyBatis Plus 官方文档](https://baomidou.com/) - MyBatis Plus 框架文档
|
||
- [Salesforce Metadata API 文档](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/) - Salesforce Metadata API 文档
|