Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法_Java_Spring_Amazon Web Services_Amazon S3 - Fatal编程技术网

Java 使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法

Java 使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法,java,spring,amazon-web-services,amazon-s3,Java,Spring,Amazon Web Services,Amazon S3,目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建AmazonS3客户端的一个实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类的一个实例,在上传完文件后(这由TransferManager的waitForCompletion方法检查)我们正在调用方法Tr

目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建AmazonS3客户端的一个实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类的一个实例,在上传完文件后(这由TransferManager的waitForCompletion方法检查)我们正在调用方法TransferManager.shutdownNow(false)来关闭它创建的所有线程,如下所示:

@AutoWired
private AmazonS3 s3Client;


   /**
 * Uploads a file using TransferManager from a MultipartFile.
 */
public String uploadFileParallelized(MultipartFile file) {
  String fileName;
  TransferManager transferManager =
      TransferManagerBuilder.standard().withS3Client(this.s3Client).build();

  try {
    String extension = getExtensionFromBytes(file.getBytes());
    fileName = getFileName(extension);

    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(file.getSize());
    metadata.setContentType(file.getContentType());

    Upload upload = transferManager.upload(getBucketName(), this.folder + fileName,
        file.getInputStream(), metadata);
    upload.waitForCompletion();
  } catch (IOException | AmazonClientException | InterruptedException e) {
    throw new FileUploadException("Couldn't upload the file to S3: " + e.getLocalizedMessage(),
        e);
  } finally {
    transferManager.shutdownNow(false);
  }


  return fileName;
}
我仍然有疑问:

  • 我不确定您是应该为每次上载实例化transferManager,还是应该只使用transferManager的一个实例(可能是bean),但在这种情况下,我将无法调用transferManager.shutdownNow(false)方法,因为我将无法在第二次上载时使用它

  • 即使我没有调用shutdownNow方法,TransferManager是否会关闭用于上载文件的所有线程

  • 使用同一个AmazonS3客户端创建TransferManager的多个实例可以吗?还是应该为我们需要的每个TransferManager创建一个S3Client

  • 即使文件很小(比如小于5MB),我们是否也应该使用TransferManager

  • 所有上载完成后,您应该在单个
    TransferManager
    实例上调用
    Shutdownow

    TransferManager负责管理以下资源: 连接和线程;共享TransferManager的单个实例 TransferManager,就像 AWS SDK for Java是线程安全的。调用TransferManager.shutdownNow() 在传输完成后释放资源

  • 默认情况下,当传输管理器实例被垃圾收集时,线程池将关闭

  • 您应该使用相同的S3客户端。它是线程安全的

  • minUploadPartSize
    为5MB,
    minUploadThresholdSize
    为16MB。您可以使用
    TransferManager
    对所有文件进行
    upload
    上传,它将根据文件大小对文件进行分解。这些选项是可配置的。如果您知道所有文件都相对较小,则可能比较容易r改为使用
    putObject