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

}

}

相关推荐
菠萝崽.1 小时前
RabbitMQ高级篇-MQ的可靠性
java·分布式·后端·消息队列·rabbitmq·异步编程
万叶学编程2 小时前
@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse
java
zfj3213 小时前
H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
java·数据库·sql·学习·数据库底层原理
编程、小哥哥4 小时前
Java面试实战:从Spring Boot到分布式缓存的深度探索
java·spring boot·redis·微服务·grpc·缓存技术·面试技巧
在未来等你4 小时前
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发
java·微服务·云原生·大模型·spring ai
androidwork4 小时前
Android Kotlin权限管理最佳实践
android·java·kotlin
sakoba4 小时前
Tomcat简述介绍
java·tomcat
键盘客5 小时前
Spring Boot 配置明文密码加密,防泄漏
java·spring boot·后端·spring
二进制小甜豆6 小时前
SpringBoot快速上手
java·spring boot·maven
苹果酱05676 小时前
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
java·vue.js·spring boot·mysql·课程设计