並列転送を使用するように 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; }
このアプローチにより、切り捨てられたオブジェクトやアップロードの失敗など、コンテンツの長さを手動で指定した場合に発生する可能性のある問題を回避できます。