You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
445 lines
22 KiB
445 lines
22 KiB
|
1 month ago
|
# 任务调度
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文引用的文件**
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [IFileInfoService.java](file://crm-file/src/main/java/com/crm/file/service/IFileInfoService.java)
|
||
|
|
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
|
||
|
|
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
|
||
|
|
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
|
||
|
|
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
|
||
|
|
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
|
||
|
|
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
|
||
|
|
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
|
||
|
|
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
|
||
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
||
|
|
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
|
||
|
|
- [BusinessErrorException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/BusinessErrorException.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [引言](#引言)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构总览](#架构总览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖关系分析](#依赖关系分析)
|
||
|
|
7. [性能考虑](#性能考虑)
|
||
|
|
8. [故障排查指南](#故障排查指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
10. [附录](#附录)
|
||
|
|
|
||
|
|
## 引言
|
||
|
|
本技术文档围绕文件服务的任务调度能力,系统阐述异步任务处理、定时任务调度与清理任务执行等核心功能。重点覆盖孤立分片清理算法、任务状态管理、失败重试机制、任务配置参数与执行频率设置、资源监控与运维要点,以及分布式环境下的任务协调与数据一致性保障。同时提供日志分析、性能监控与故障排查指南,并给出自定义任务开发规范与最佳实践建议,帮助读者快速理解并高效扩展该系统的任务调度能力。
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
本项目采用多模块分层组织:
|
||
|
|
- crm-app:应用启动入口与全局配置
|
||
|
|
- crm-base:基础能力(通用实体、异常、结果封装、配置、工具类)
|
||
|
|
- crm-file:文件服务模块,包含文件上传下载、预览、任务调度与清理逻辑
|
||
|
|
- docs:文档与代理相关说明
|
||
|
|
|
||
|
|
关键调度相关位置:
|
||
|
|
- 调度配置与属性:crm-base 的 ScheduledTaskProperties
|
||
|
|
- 文件服务调度:crm-file 的 SchedulingConfig、OrphanChunkCleanupTask
|
||
|
|
- 文件元数据与持久化:crm-file 的 FileInfo、FileInfoMapper、FileInfoServiceImpl
|
||
|
|
- 分布式ID生成:crm-base 的 SnowflakeIdWorker、SnowflakeProperties
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "应用层"
|
||
|
|
APP["CrmAppApplication"]
|
||
|
|
CFG_APP["application.yml"]
|
||
|
|
end
|
||
|
|
subgraph "基础能力"
|
||
|
|
PROP["ScheduledTaskProperties"]
|
||
|
|
IDW["SnowflakeIdWorker"]
|
||
|
|
IDP["SnowflakeProperties"]
|
||
|
|
EXC["GlobalExceptionHandlerAdvice"]
|
||
|
|
end
|
||
|
|
subgraph "文件服务"
|
||
|
|
SCH["SchedulingConfig"]
|
||
|
|
TASK["OrphanChunkCleanupTask"]
|
||
|
|
SVC["FileInfoServiceImpl"]
|
||
|
|
MAPPER["FileInfoMapper"]
|
||
|
|
ENT["FileInfo"]
|
||
|
|
DTO1["UploadSession"]
|
||
|
|
DTO2["MultipartInitDTO"]
|
||
|
|
DTO3["FileDownloadDTO"]
|
||
|
|
DTO4["FileInfoDTO"]
|
||
|
|
CONST["FileConstants"]
|
||
|
|
end
|
||
|
|
APP --> CFG_APP
|
||
|
|
APP --> PROP
|
||
|
|
APP --> SCH
|
||
|
|
SCH --> TASK
|
||
|
|
TASK --> SVC
|
||
|
|
SVC --> MAPPER
|
||
|
|
SVC --> ENT
|
||
|
|
TASK --> CONST
|
||
|
|
SVC --> DTO1
|
||
|
|
SVC --> DTO2
|
||
|
|
SVC --> DTO3
|
||
|
|
SVC --> DTO4
|
||
|
|
IDW --> IDP
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
|
||
|
|
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
|
||
|
|
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
|
||
|
|
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
|
||
|
|
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
|
||
|
|
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
- 调度配置与属性
|
||
|
|
- ScheduledTaskProperties:集中管理调度开关、线程池、批大小、超时等参数,便于统一治理
|
||
|
|
- SchedulingConfig:启用并装配定时任务,定义调度策略与执行上下文
|
||
|
|
- 清理任务
|
||
|
|
- OrphanChunkCleanupTask:周期性扫描并清理孤立的上传分片,释放存储与数据库资源
|
||
|
|
- 文件服务实现
|
||
|
|
- FileInfoServiceImpl:文件元数据管理与业务编排,配合 Mapper 完成持久化
|
||
|
|
- FileInfoMapper:数据访问接口,支撑查询、更新与统计
|
||
|
|
- 分布式ID
|
||
|
|
- SnowflakeIdWorker/SnowflakeProperties:提供高并发唯一ID,避免冲突与热点
|
||
|
|
- 异常与结果封装
|
||
|
|
- GlobalExceptionHandlerAdvice:统一异常处理,保证任务执行过程中的错误可观测性
|
||
|
|
- Result/PageResult:标准化返回结构,便于上层消费
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
|
||
|
|
## 架构总览
|
||
|
|
整体架构以“配置驱动 + 定时任务 + 服务编排”为核心:
|
||
|
|
- 应用启动时加载 application.yml 与 ScheduledTaskProperties,初始化调度器与线程池
|
||
|
|
- SchedulingConfig 注册 OrphanChunkCleanupTask,按固定频率触发
|
||
|
|
- 任务执行时通过 FileInfoServiceImpl 与 FileInfoMapper 进行数据扫描与清理
|
||
|
|
- 使用 SnowflakeIdWorker 生成唯一ID,确保分布式环境下幂等与去重
|
||
|
|
- 异常由 GlobalExceptionHandlerAdvice 统一捕获并记录,便于追踪
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant App as "应用启动"
|
||
|
|
participant Prop as "ScheduledTaskProperties"
|
||
|
|
participant Sch as "SchedulingConfig"
|
||
|
|
participant Task as "OrphanChunkCleanupTask"
|
||
|
|
participant Svc as "FileInfoServiceImpl"
|
||
|
|
participant Map as "FileInfoMapper"
|
||
|
|
participant DB as "数据库"
|
||
|
|
App->>Prop : "加载调度配置"
|
||
|
|
App->>Sch : "注册定时任务"
|
||
|
|
Sch-->>Task : "按周期触发"
|
||
|
|
Task->>Svc : "调用清理逻辑"
|
||
|
|
Svc->>Map : "查询待清理分片"
|
||
|
|
Map->>DB : "执行SQL"
|
||
|
|
DB-->>Map : "返回结果集"
|
||
|
|
Map-->>Svc : "返回数据"
|
||
|
|
Svc->>Svc : "过滤与合并分片"
|
||
|
|
Svc->>Map : "删除孤立分片"
|
||
|
|
Svc-->>Task : "返回清理统计"
|
||
|
|
Task-->>Sch : "记录执行结果"
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### 孤立分片清理算法(OrphanChunkCleanupTask)
|
||
|
|
- 目标:识别并清理未关联到任何有效文件的上传分片,防止存储膨胀与数据不一致
|
||
|
|
- 输入:分片元数据集合(含会话ID、分片序号、时间戳等)
|
||
|
|
- 处理流程:
|
||
|
|
- 批量查询候选分片
|
||
|
|
- 根据会话有效性、文件完整性校验规则过滤
|
||
|
|
- 对确认为孤立的分片执行删除操作
|
||
|
|
- 统计清理数量与耗时,输出日志
|
||
|
|
- 复杂度与优化:
|
||
|
|
- 查询阶段采用分页与索引优化,降低全表扫描
|
||
|
|
- 删除阶段批量提交,减少事务开销
|
||
|
|
- 支持可配置的批大小与并发度,平衡吞吐与资源占用
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Start(["开始"]) --> LoadCfg["读取调度配置<br/>批大小/超时/并发"]
|
||
|
|
LoadCfg --> Query["分页查询候选分片"]
|
||
|
|
Query --> Validate{"会话有效且文件完整?"}
|
||
|
|
Validate --> |否| MarkOrphan["标记为孤立分片"]
|
||
|
|
Validate --> |是| Keep["保留分片"]
|
||
|
|
MarkOrphan --> BatchDelete["批量删除孤立分片"]
|
||
|
|
Keep --> NextPage{"是否还有下一页?"}
|
||
|
|
BatchDelete --> NextPage
|
||
|
|
NextPage --> |是| Query
|
||
|
|
NextPage --> |否| Stats["统计清理结果"]
|
||
|
|
Stats --> Log["记录执行日志"]
|
||
|
|
Log --> End(["结束"])
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
|
||
|
|
### 任务状态管理与失败重试
|
||
|
|
- 状态管理:
|
||
|
|
- 基于 BaseEntity/OwneEntity 的通用字段维护创建时间、更新时间、状态码等
|
||
|
|
- 结合 Result 与 PageResult 统一封装任务执行结果与分页信息
|
||
|
|
- 失败重试:
|
||
|
|
- 在任务编排层对可重试异常进行捕获与指数退避重试
|
||
|
|
- 通过 ScheduledTaskProperties 控制最大重试次数、间隔与超时
|
||
|
|
- 记录重试轨迹与最终失败原因,便于审计与告警
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class BaseEntity {
|
||
|
|
+id
|
||
|
|
+createTime
|
||
|
|
+updateTime
|
||
|
|
+status
|
||
|
|
}
|
||
|
|
class OwnedEntity {
|
||
|
|
+ownerId
|
||
|
|
+tenantId
|
||
|
|
}
|
||
|
|
class FileInfo {
|
||
|
|
+fileId
|
||
|
|
+sessionId
|
||
|
|
+chunkIndex
|
||
|
|
+size
|
||
|
|
+md5
|
||
|
|
+status
|
||
|
|
}
|
||
|
|
class UploadSession {
|
||
|
|
+sessionId
|
||
|
|
+totalChunks
|
||
|
|
+expireAt
|
||
|
|
}
|
||
|
|
class MultipartInitDTO {
|
||
|
|
+sessionId
|
||
|
|
+fileName
|
||
|
|
+chunkSize
|
||
|
|
}
|
||
|
|
class FileDownloadDTO {
|
||
|
|
+fileId
|
||
|
|
+downloadToken
|
||
|
|
}
|
||
|
|
class FileInfoDTO {
|
||
|
|
+fileId
|
||
|
|
+name
|
||
|
|
+size
|
||
|
|
+url
|
||
|
|
}
|
||
|
|
OwnedEntity <|-- BaseEntity
|
||
|
|
FileInfo --> UploadSession : "关联会话"
|
||
|
|
FileInfo --> MultipartInitDTO : "初始化参数"
|
||
|
|
FileInfo --> FileDownloadDTO : "下载响应"
|
||
|
|
FileInfo --> FileInfoDTO : "信息展示"
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
|
||
|
|
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
|
||
|
|
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
|
||
|
|
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
|
||
|
|
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
|
||
|
|
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
|
||
|
|
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
|
||
|
|
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
|
||
|
|
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
|
||
|
|
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
|
||
|
|
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
|
||
|
|
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
|
||
|
|
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
|
||
|
|
|
||
|
|
### 分布式ID与一致性保障
|
||
|
|
- SnowflakeIdWorker:基于时间戳+机器ID+序列号生成全局唯一ID,避免重复与冲突
|
||
|
|
- 一致性策略:
|
||
|
|
- 使用唯一ID作为幂等键,确保任务幂等执行
|
||
|
|
- 在删除前校验分片归属与会话状态,防止误删
|
||
|
|
- 通过事务边界包裹批量删除,保证原子性
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Task as "OrphanChunkCleanupTask"
|
||
|
|
participant Svc as "FileInfoServiceImpl"
|
||
|
|
participant Map as "FileInfoMapper"
|
||
|
|
participant DB as "数据库"
|
||
|
|
Task->>Svc : "请求清理孤立分片"
|
||
|
|
Svc->>Map : "查询候选分片(分页)"
|
||
|
|
Map->>DB : "SELECT ... WHERE ..."
|
||
|
|
DB-->>Map : "返回分片列表"
|
||
|
|
Map-->>Svc : "分片集合"
|
||
|
|
Svc->>Svc : "校验会话与完整性"
|
||
|
|
Svc->>Map : "DELETE FROM chunk WHERE id IN (...)"
|
||
|
|
Map->>DB : "执行批量删除"
|
||
|
|
DB-->>Map : "影响行数"
|
||
|
|
Map-->>Svc : "删除结果"
|
||
|
|
Svc-->>Task : "返回统计信息"
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
|
||
|
|
### 文件预览与外部集成(可选)
|
||
|
|
- KkFileViewClient:对接第三方预览服务,用于在线预览文件内容
|
||
|
|
- 在任务或业务流程中按需调用,注意超时与降级策略
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
|
||
|
|
|
||
|
|
## 依赖关系分析
|
||
|
|
- 模块内依赖:
|
||
|
|
- OrphanChunkCleanupTask 依赖 FileInfoServiceImpl、FileInfoMapper
|
||
|
|
- FileInfoServiceImpl 依赖 FileInfoMapper、常量与DTO
|
||
|
|
- SchedulingConfig 依赖 ScheduledTaskProperties 与任务类
|
||
|
|
- 跨模块依赖:
|
||
|
|
- crm-file 依赖 crm-base 的通用实体、异常、结果封装与ID生成
|
||
|
|
- 外部依赖:
|
||
|
|
- 数据库(MyBatis Plus)、可能的对象存储(MinIO)与预览服务(KkFileView)
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph LR
|
||
|
|
SCH["SchedulingConfig"] --> TASK["OrphanChunkCleanupTask"]
|
||
|
|
TASK --> SVC["FileInfoServiceImpl"]
|
||
|
|
SVC --> MAP["FileInfoMapper"]
|
||
|
|
SVC --> ENT["FileInfo"]
|
||
|
|
SVC --> DTO["UploadSession/MultipartInitDTO/FileDownloadDTO/FileInfoDTO"]
|
||
|
|
SVC --> CONST["FileConstants"]
|
||
|
|
TASK --> PROP["ScheduledTaskProperties"]
|
||
|
|
SVC --> IDW["SnowflakeIdWorker"]
|
||
|
|
IDW --> IDP["SnowflakeProperties"]
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
|
||
|
|
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
|
||
|
|
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
|
||
|
|
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
|
||
|
|
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
|
||
|
|
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
|
||
|
|
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
|
||
|
|
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
|
||
|
|
- [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
|
||
|
|
## 性能考虑
|
||
|
|
- 批处理与分页:
|
||
|
|
- 合理设置批大小与页大小,避免单次处理过大导致内存与锁竞争
|
||
|
|
- 并发与线程池:
|
||
|
|
- 通过 ScheduledTaskProperties 配置线程池容量与队列长度,避免阻塞与溢出
|
||
|
|
- 索引与SQL优化:
|
||
|
|
- 针对分片查询条件建立合适索引,减少全表扫描
|
||
|
|
- 使用批量删除与最小化字段选择提升吞吐
|
||
|
|
- 超时与熔断:
|
||
|
|
- 设置合理的任务超时与外部服务超时,防止级联故障
|
||
|
|
- 监控指标:
|
||
|
|
- 记录任务执行时长、成功率、失败率、清理数量、内存与CPU占用
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 故障排查指南
|
||
|
|
- 常见问题定位:
|
||
|
|
- 任务未执行:检查 SchedulingConfig 是否启用、cron表达式是否正确、线程池是否耗尽
|
||
|
|
- 清理不生效:核对查询条件与索引、确认会话有效性判断逻辑、检查事务边界
|
||
|
|
- 数据不一致:验证幂等键与唯一ID生成、检查删除前的归属校验
|
||
|
|
- 日志与监控:
|
||
|
|
- 关注任务执行日志中的统计信息与异常堆栈
|
||
|
|
- 结合数据库慢查询与锁等待信息进行优化
|
||
|
|
- 异常处理:
|
||
|
|
- GlobalExceptionHandlerAdvice 统一捕获并记录,便于追溯
|
||
|
|
- BusinessErrorException 用于业务异常,区分系统异常与业务异常
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [BusinessErrorException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/BusinessErrorException.java)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
本任务调度体系以配置驱动与定时任务为核心,结合清晰的分层设计与统一的异常处理,实现了高效的孤立分片清理与稳定的任务执行。通过分布式ID、幂等性与事务保障,系统在分布式环境下具备良好的一致性与可靠性。建议在运维侧完善监控与告警,持续优化SQL与批处理策略,并遵循自定义任务开发规范,确保扩展任务的稳定性与可维护性。
|
||
|
|
|
||
|
|
[本节为总结性内容,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 附录
|
||
|
|
- 任务配置参数建议:
|
||
|
|
- 批大小:根据数据量与内存调整,常见范围 100~1000
|
||
|
|
- 并发度:依据CPU与IO能力设定,避免过度并发
|
||
|
|
- 超时:设置任务与外部调用的超时阈值,防止长时间阻塞
|
||
|
|
- 自定义任务开发规范:
|
||
|
|
- 使用 ScheduledTaskProperties 统一管理配置
|
||
|
|
- 实现幂等与重试,记录执行轨迹与统计
|
||
|
|
- 使用唯一ID与事务保障一致性
|
||
|
|
- 对外部依赖增加超时与降级策略
|
||
|
|
- 最佳实践:
|
||
|
|
- 优先使用分页与批量操作
|
||
|
|
- 对热点表建立合适索引
|
||
|
|
- 定期评估与调整批大小与并发度
|
||
|
|
- 完善日志与监控,形成闭环
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|