当前位置: 首页 > news >正文

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

http://www.xdnf.cn/news/188857.html

相关文章:

  • yolov5 源码 +jupyter notebook 笔记 kaggle
  • quickbi finebi 测评(案例讲解)
  • MySQL 主从复制
  • 图像保边滤波之BEEPS滤波算法
  • KUKA机器人自动备份设置
  • vscode 使用gitcode团队管理项目
  • 区块链随学随记
  • jetson nano上Ubuntu系统调用摄像头bug
  • 塔能科技:点亮节能之光,赋能工厂与城市
  • 20250428-AI Agent:智能体的演进与未来
  • 包装产线通过canopen转Profinet网关控制伺服
  • 关于常量指针和指向常量的指针
  • 泰山派常用命令
  • map和set:
  • ai环境conda带torch整体迁移。
  • 一文了解 模型上下文协议(MCP)
  • word插入APA格式的参考文献
  • NGINX ngx_http_addition_module 模块响应体前后注入内容
  • VS2022+OpenCasCade配置编译
  • 【leetcode】最长公共子路径问题
  • 从大众传媒到数字生态:开源AI智能名片链动2+1模式S2B2C商城小程序驱动的营销革命
  • prompt提示词编写技巧
  • Context7 MCP:提供实时、版本特定的文档以解决AI幻觉问题
  • Go 语言入门:(一) 环境安装
  • 大语言模型(LLMs)微调技术总结
  • web 基础与 http 协议
  • 【JAVA ee初阶】多线程(3)
  • es+kibana---集群部署
  • MYOJ_1349:(洛谷P3951)[NOIP 2017 提高组] 小凯的疑惑(数学公式套用,两步搞定代码)
  • 快速上手QEMU:创建你的第一个虚拟机实例