本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将基于 Java 的 S3 异步客户端配置为使用并行传输
从版本 2.27.5 开始,基于 Java 的标准 S3 异步客户端支持自动并行传输(分段上传和下载)。在创建基于 Java 的 S3 异步客户端时,您可以配置对并行传输的支持。
本节介绍如何启用并行传输以及如何自定义配置。
创建 S3AsyncClient 的实例
当您不在生成器multipart* 方法的情况下创建 S3AsyncClient 实例时,不会启用并行传输。以下每条语句都创建一个基于 Java 的 S3 异步客户端,不支持分段上传和下载。
在没有分段支持的情况下创建
import software.amazon.awssdk.auth.credentials.ProcessCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3AsyncClient; S3AsyncClient s3Client = S3AsyncClient.create(); S3AsyncClient s3Client2 = S3AsyncClient.builder().build(); S3AsyncClient s3Client3 = S3AsyncClient.builder() .credentialsProvider(ProcessCredentialsProvider.builder().build()) .region(Region.EU_NORTH_1) .build();
在有分段支持的情况下创建
要使用默认设置启用并行传输,请在生成器上调用 multipartEnabled 并传入 true,如下例所示。
S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder() .multipartEnabled(true) .build();
thresholdInBytes 和 minimumPartSizeInBytes 设置的默认值为 8 MiB。
如果您自定义分段设置,则会自动启用并行传输,如下所示。
import software.amazon.awssdk.services.s3.S3AsyncClient; import static software.amazon.awssdk.transfer.s3.SizeConstant.MB; S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder() .multipartConfiguration(b -> b .thresholdInBytes(16 * MB) .minimumPartSizeInBytes(10 * MB)) .build();
上传未知大小的流
启用了分段功能的基于 Java 的 S3 异步客户端可以有效地处理事先不知道总大小的输入流:
public PutObjectResponse asyncClient_multipart_stream_unknown_size(String bucketName, String key, InputStream inputStream) { S3AsyncClient s3AsyncClient = S3AsyncClient.builder().multipartEnabled(true).build(); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the // content length is unknown. CompletableFuture<PutObjectResponse> responseFuture = s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body) .exceptionally(e -> { if (e != null) { logger.error(e.getMessage(), e); } return null; }); PutObjectResponse response = responseFuture.join(); // Wait for the response. executor.shutdown(); return response; }
这种方法可以防止手动指定错误的内容长度时可能出现的问题,例如对象截断或上传失败。