datai-vue/doc/salesforce/task/MetadataChangeAutoSyncTask.md

253 lines
8.0 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.

# MetadataChangeAutoSyncTask - 元数据变更自动同步任务
## 任务信息
- **任务名称**: MetadataChangeAutoSyncTask
- **Bean 名称**: metadataChangeAutoSyncTask
- **类路径**: `com.datai.integration.task.MetadataChangeAutoSyncTask`
- **执行方法**: `autoSyncMetadataChanges()`
- **模块归属**: Salesforce 集成 - 定时任务
- **创建日期**: 2026-01-16
- **最后更新**: 2026-01-16
## 功能描述
自动扫描所有未同步的元数据变更记录,判断是否满足自动同步条件,并调用相应的同步方法,将元数据变更同步到本地数据库。该任务负责及时同步 Salesforce 中的对象和字段变更。
## 执行条件
### 通用条件
1. **syncStatus = false 或 null**(未同步)
- 元数据变更尚未同步到本地数据库
2. **retryCount < 3**重试次数小于3次
- 避免无限重试失败的元数据变更
### 对象变更条件changeType = OBJECT
1. **对象配置完整**
- `objectApi` 不为空
- `objectLabel` 不为空
2. **对象启用同步**
- `DataiIntegrationObject.isWork = true`
3. **对象当前没有正在执行的同步任务**
- `DataiIntegrationObject.syncStatus = false`
4. **根据操作类型判断**
- CREATE总是允许自动同步
- UPDATE总是允许自动同步
- DELETE总是允许自动同步
### 字段变更条件changeType = FIELD
1. **字段配置完整**
- `objectApi` 不为空
- `fieldApi` 不为空
- `fieldLabel` 不为空
2. **对象启用同步**
- `DataiIntegrationObject.isWork = true`
3. **对象当前没有正在执行的同步任务**
- `DataiIntegrationObject.syncStatus = false`
4. **根据操作类型判断**
- CREATE总是允许自动同步
- UPDATE总是允许自动同步
- DELETE总是允许自动同步
## 执行流程
```
开始
查询所有未同步的元数据变更记录syncStatus = false 或 null
遍历每个元数据变更记录
判断是否满足自动同步条件
满足条件?
├─ 是 → 调用 syncToLocalDatabase(id)
│ ↓
│ 记录成功/失败
│ ↓
│ 继续下一个元数据变更
└─ 否 → 跳过,记录日志
继续下一个元数据变更
输出统计信息
结束
```
## 执行结果统计
任务执行完成后,会输出以下统计信息:
| 统计项 | 描述 |
|--------|------|
| 扫描记录数 | 共扫描的元数据变更记录总数 |
| 成功同步数 | 成功同步的元数据变更记录数量 |
| 跳过数 | 不满足同步条件被跳过的元数据变更记录数量 |
| 失败数 | 同步失败的元数据变更记录数量 |
## 日志输出
### INFO 级别
```
开始执行元数据变更自动同步任务
查询到 5 条未同步的元数据变更记录
开始同步元数据变更变更ID: 1, 变更类型: OBJECT, 操作类型: CREATE, 对象API: Account
元数据变更同步成功变更ID: 1
元数据变更自动同步任务完成,共扫描 5 条记录,成功同步 4 条,跳过 1 条,失败 0 条
```
### DEBUG 级别
```
元数据变更不满足同步条件跳过同步变更ID: 2, 变更类型: FIELD, 操作类型: UPDATE
```
### WARN 级别
```
未找到对象配置对象API: CustomObject__c
```
### ERROR 级别
```
元数据变更同步失败变更ID: 3
更新元数据变更同步失败状态时发生异常变更ID: 3
执行元数据变更自动同步任务失败
```
## 异常处理
### 任务级别异常
- 捕获所有异常,记录错误日志
- 不影响其他元数据变更的同步操作
- 任务继续执行直到所有元数据变更处理完成
### 元数据变更级别异常
- 捕获单个元数据变更同步失败的异常
- 记录错误日志包含变更ID、变更类型和操作类型
- 增加失败计数,继续处理下一个元数据变更
### 同步失败状态更新
- 同步失败时,更新元数据变更的同步失败状态:
- `syncErrorMessage`: 记录错误信息
- `retryCount`: 重试次数加1
- `lastRetryTime`: 记录最后重试时间
## 配置示例
### Quartz 任务配置
```sql
INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, status, remark)
VALUES (
'元数据变更自动同步任务',
'DEFAULT',
'metadataChangeAutoSyncTask.autoSyncMetadataChanges',
'0 0 * * * ?',
'0',
'每小时执行一次元数据变更自动同步任务'
);
```
### Cron 表达式说明
| 字段 | 值 | 说明 |
|------|-----|------|
| 秒 | 0 | 第0秒 |
| 分 | 0 | 第0分 |
| 时 | * | 每小时 |
| 日 | * | 每天 |
| 月 | * | 每月 |
| 周 | ? | 不指定 |
## 注意事项
1. **执行频率建议**
- 建议每小时执行一次
- 及时同步元数据变更,确保本地数据库与 Salesforce 保持一致
- 避免在业务高峰期执行
2. **对象配置要求**
- 确保元数据变更的对象配置完整
- 确保对象已启用同步isWork = true
- 确保对象当前没有正在执行的同步任务
3. **重试机制**
- 失败的元数据变更会自动重试最多重试3次
- 超过3次重试后元数据变更将不再自动同步
- 需要手动处理重试次数超过3次的元数据变更
4. **性能考虑**
- 元数据变更数量较多时,任务执行时间可能较长
- 建议监控任务执行时间,必要时调整执行频率
- 考虑分批处理以避免长时间占用资源
5. **数据一致性**
- 同步前确保元数据变更信息完整
- 建议在同步前进行数据校验
- 记录同步失败的记录,便于后续处理
6. **变更类型处理**
- 对象变更OBJECT处理对象的创建、更新、删除
- 字段变更FIELD处理字段的创建、更新、删除
- 其他变更类型:不处理,记录日志
## 相关接口
- [syncToLocalDatabase](../integration/DataiIntegrationMetadataChangeController/0007-sync-to-local.md) - 同步单个元数据变更到本地数据库
- [syncBatchToLocalDatabase](../integration/DataiIntegrationMetadataChangeController/0008-sync-batch-to-local.md) - 批量同步元数据变更到本地数据库
## 相关文档
- [需求文档 - 元数据变更自动同步本地数据库](../../requirements/REQ-006.md)
- [架构决策 - 元数据变更自动同步本地数据库](../../decisions/adr/0006-metadata-change-auto-sync.md)
- [变更记录 - 元数据变更自动同步本地数据库](../../changelog/0016-metadata-change-auto-sync.md)
## 测试信息
### 测试环境
- **环境**: 开发环境
- **版本**: v1.0
### 测试用例
| 测试场景 | 输入参数 | 预期结果 | 实际结果 | 状态 |
|----------|----------|----------|----------|------|
| 正常同步对象变更 | changeType = OBJECT, operationType = CREATE | 成功同步对象变更 | 成功同步对象变更 | 通过 |
| 正步同步字段变更 | changeType = FIELD, operationType = UPDATE | 成步同步字段变更 | 成步同步字段变更 | 通过 |
| 跳过已同步的变更 | syncStatus = true | 跳过该变更 | 跳过该变更 | 通过 |
| 跳过重试次数超限的变更 | retryCount = 3 | 跳过该变更 | 跳过该变更 | 通过 |
| 跳过对象未启用同步的变更 | isWork = false | 跳过该变更 | 跳过该变更 | 通过 |
| 跳过对象正在同步的变更 | syncStatus = true | 跳过该变更 | 跳过该变更 | 通过 |
| 同步失败 | 对象配置不完整 | 记录失败,更新重试次数 | 记录失败,更新重试次数 | 通过 |
## 实现细节
- 使用 `@Component("metadataChangeAutoSyncTask")` 注解注册为 Spring Bean
- 使用 `@Slf4j` 注解进行日志记录
- 使用 `@Autowired` 注入 `IDataiIntegrationMetadataChangeService``IDataiIntegrationObjectService`
- 查询所有未同步的元数据变更记录
- 遍历每个元数据变更,逐个判断同步条件
- 调用 `metadataChangeService.syncToLocalDatabase(id)` 执行同步
- 同步失败时,更新元数据变更的同步失败状态
- 记录详细的日志信息,便于问题排查
- 使用独立的条件判断方法,提高代码可读性和可维护性