Callable Future 实现多线程按照顺序上传文件
/**
* 异步上传 BiopsyFlow 中的所有视频和音频文件到暂存服务器
*/
private List<String> uploadBiopsyFlowFiles(BiopsyFlow biopsyFlow, SyncFile SyncFile) {
List<String> fileBase64List = syncFile.getFileBase64List();
if (CollectionUtils.isEmpty(syncFile.getFileBase64List())) {
log.info("没有文件需要上传");
return Collections.emptyList();
}
log.info("上传文件数量:{}", fileBase64List.size());
List<Callable<String>> tasks = new ArrayList<>();
for (String file : fileBase64List) {
Callable<String> task = () -> {
log.debug("上传线程:{}", Thread.currentThread().getName());
try {
return fileDealUtils.uploadTxFile(file, biopsyFlow.getTransId());
} catch (Exception e) {
log.error("文件上传失败, 异常={}", e.getMessage());
return null;
}
};
tasks.add(task);
}
// 使用公共线程池提交任务
List<Future<String>> futures = new ArrayList<>();
try {
for (Callable<String> task : tasks) {
Future<String> future = pullVideoTaskExecutor.submit(task);
futures.add(future);
}
// 按顺序获取结果
List<String> fileIds = new ArrayList<>();
for (Future<String> future : futures) {
try {
String fileId = future.get();
if (fileId != null) {
fileIds.add(fileId);
} else {
log.error("文件上传失败: 返回的文件ID为空");
return Collections.emptyList();
}
} catch (Exception e) {
log.error("文件上传失败: 异常={}", e.getMessage());
return Collections.emptyList();
}
}
// // TODO 测试下载,上线之前删除
// for (String fileId : fileIds) {
// String base64 = fileDealUtils.testDownMp4(fileId);
// log.info("下载的文件id:{}, 对应下载的视频base64:{}", fileId,base64.substring(0,100));
// }
return fileIds;
} catch (Exception e) {
log.error("任务执行过程中发生异常", e);
return Collections.emptyList();
}
}