【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版
一、代码结构概览
该定时任务实现了自动清理回收站中过期文件的功能,主要包含:
- 定时任务配置
- 过期文件查询
- 按用户分组处理
- 批量删除操作
二、核心代码解析
@Component
public class FileCleanTask {
@Resource
private FileInfoService fileInfoService;
@Scheduled(fixedDelay = 1000 * 60 * 3)
public void execute() {
// 1. 构建查询条件
FileInfoQuery fileInfoQuery = new FileInfoQuery();
fileInfoQuery.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
fileInfoQuery.setQueryExpire(true);
// 2. 查询过期文件
List<FileInfo> fileInfoList = fileInfoService.findListByParam(fileInfoQuery);
// 3. 按用户分组
Map<String, List<FileInfo>> fileInfoMap = fileInfoList.stream()
.collect(Collectors.groupingBy(FileInfo::getUserId));
// 4. 批量删除处理
for (Map.Entry<String, List<FileInfo>> entry : fileInfoMap.entrySet()) {
List<String> fileIds = entry.getValue().stream()
.map(p -> p.getFileId())
.collect(Collectors.toList());
fileInfoService.delFileBatch(
entry.getKey(),
String.join(",", fileIds),
false
);
}
}
}
三、关键组件分析
1. 定时任务配置
@Scheduled(fixedDelay = 1000 * 60 * 3)
- 执行频率:每3分钟执行一次(180,000毫秒)
- 执行策略:fixedDelay确保上次执行完成后间隔指定时间再执行
- 线程模型:默认使用单线程定时任务执行器
2. 查询条件构建
fileInfoQuery.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
fileInfoQuery.setQueryExpire(true);
- 回收站标识:筛选状态为"回收站"的文件
- 过期标记:
queryExpire=true
表示只查询已过期的文件
3. 数据处理流程
Map<String, List<FileInfo>> fileInfoMap = fileInfoList.stream()
.collect(Collectors.groupingBy(FileInfo::getUserId));
- 分组策略:按用户ID分组处理
- 优势:
- 避免混用不同用户的数据
- 便于实现用户级别的批量操作
- 减少数据库事务冲突
4. 批量删除操作
fileInfoService.delFileBatch(
entry.getKey(),
String.join(",", fileIds),
false
);
- 参数说明:
entry.getKey()
: 用户IDString.join(",", fileIds)
: 逗号分隔的文件ID列表false
: 表示不是管理员操作
- 特点:
- 使用批量删除提高效率
- 保持用户数据隔离