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();

}

}

相关推荐
知守观13 分钟前
OBS 同名文件互相覆盖,客户拿错了别人的报告:一次文件串号的排查与重构
java·后端
泡海椒1 小时前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel
梦幻通灵1 小时前
IDEA 实用快捷键【持续更新】
java·ide·intellij-idea
南归北隐1 小时前
Spring AI Alibaba Graph框架实现Tools工具调用
java·后端·spring·spring ai·spring ai tools
开开心心就好1 小时前
视频模糊怎么修复?免费工具支持批量处理
java·前端·人工智能·智能手机·pdf·excel
w_zero_one1 小时前
链表(3)
java·数据结构·算法
资深技术分享员2 小时前
遗留系统——把“改不动的老系统“接过来
java·服务器·数据库
江湖有缘2 小时前
Docker实战 | 使用Docker部署Bibliotheca阅读习惯管理工具
java·docker·容器
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatSDK:CMake构建静态库完整实现
java·开发语言·网络·c++·人工智能·学习·sdk
百度一下吧2 小时前
umi后台管理项目实战:从工程搭建到生产构建
java·前端·javascript