Transfer Manager を のバージョン 1 からバージョン 2 に移行する AWS SDK for Java - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Transfer Manager を のバージョン 1 からバージョン 2 に移行する AWS SDK for Java

この移行ガイドでは、Transfer Manager v1 と S3 Transfer Manager v2 の主な違いについて説明します。これには、コンストラクタの変更、メソッドマッピング、一般的なオペレーションのコード例が含まれます。これらの違いを確認したら、既存の Transfer Manager コードを正常に移行して、v2 でのパフォーマンスの向上と非同期オペレーションを活用できます。

AWS SDK 移行ツールについて

AWS SDK for Java には、v1 Transfer Manager API の多くを v2 に移行できる自動移行ツールが用意されています。ただし、移行ツールは複数の v1 Transfer Manager 機能をサポートしていません。このような場合は、このトピックのガイダンスを使用して Transfer Manager コードを手動で移行する必要があります。

このガイド全体で、移行ステータスインジケータは、移行ツールがコンストラクタ、メソッド、または機能を自動的に移行できるかどうかを示します。

  • ✅ サポート対象: 移行ツールはこのコードを自動的に変換できます

  • ❌ サポート対象外: コードを手動で移行する必要があります

「Supported」とマークされた項目でも、移行結果を確認し、徹底的にテストします。Transfer Manager の移行には、同期オペレーションから非同期オペレーションへのアーキテクチャの大幅な変更が含まれます。

概要

S3 Transfer Manager v2 では、Transfer Manager API に大幅な変更が導入されています。S3 Transfer Manager v2 は非同期オペレーション上に構築されており、特に AWS CRT ベースの Amazon S3 クライアントを使用する場合、パフォーマンスが向上します。

主な違い

  • パッケージ: com.amazonaws.services.s3.transfersoftware.amazon.awssdk.transfer.s3

  • クラス名: TransferManagerS3TransferManager

  • クライアントの依存関係: 同期 Amazon S3 クライアント → 非同期 Amazon S3 クライアント (S3AsyncClient

  • アーキテクチャ: 同期オペレーション → を使用した非同期オペレーション CompletableFuture

  • パフォーマンス: CRT AWS ベースのクライアントサポートで強化

高レベル変更

側面 V1 V2
Maven の依存関係 aws-java-sdk-s3 s3-transfer-manager
パッケージ com.amazonaws.services.s3.transfer software.amazon.awssdk.transfer.s3
メインクラス TransferManager S3TransferManager
Amazon S3 クライアント AmazonS3 (同期) S3AsyncClient (非同期)
戻り値タイプ ブロックオペレーション CompletableFuture<T>

Maven の依存関係

V1 V2
<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>>1.12.7871</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.31.682</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> </dependency> <!-- Optional: For enhanced performance with AWS CRT --> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.38.53</version> </dependency> </dependencies>

1 最新バージョン2 最新バージョン3 最新バージョン

クライアントコンストラクタの移行

サポートされているコンストラクタ (自動移行)

V1 コンストラクタ V2 と同等 移行ステータス
new TransferManager() S3TransferManager.create() ✅ サポートされる
TransferManagerBuilder. defaultTransferManager() S3TransferManager.create() ✅ サポートされる
TransferManagerBuilder. standard().build() S3TransferManager.builder().build() ✅ サポートされる
new TransferManager(AWSCredentials) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ サポートされる
new TransferManager( AWSCredentialsProvider) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ サポートされる

サポートされていないコンストラクタ (手動移行が必要)

V1 コンストラクタ V2 と同等 移行に関する注意事項
new TransferManager(AmazonS3) 手動移行が必要 S3AsyncClient個別に作成する
new TransferManager(AmazonS3, ExecutorService) 手動移行が必要 を作成しS3AsyncClient、エグゼキュターを設定する
new TransferManager(AmazonS3, ExecutorService, boolean) 手動移行が必要 shutDownThreadPools パラメータはサポートされていません

手動移行の例

V1 コード:

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); TransferManager transferManager = new TransferManager(s3Client);

V2 コード:

// Create an `S3AsyncClient` with similar configuration S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .credentialsProvider(DefaultCredentialsProvider.create()) .build(); // Provide the configured `S3AsyncClient` to the S3 transfer manager builder. S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();

クライアントメソッドの移行

現在、移行ツールは基本的な copy、、downloaduploaduploadDirectoryresumeDownload、および downloadDirectoryresumeUploadメソッドをサポートしています。

コア転送方法

V1 メソッド V2 メソッド 戻り値の型の変更 移行ステータス
upload(String, String, File) uploadFile(UploadFileRequest) UploadFileUpload ✅ サポートされる
upload(PutObjectRequest) upload(UploadRequest) UploadUpload ✅ サポートされる
download(String, String, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ サポートされる
download(GetObjectRequest, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ サポートされる
copy(String, String, String, String) copy(CopyRequest) CopyCopy ✅ サポートされる
copy(CopyObjectRequest) copy(CopyRequest) CopyCopy ✅ サポートされる
uploadDirectory(String, String, File, boolean) uploadDirectory( UploadDirectoryRequest) MultipleFileUploadDirectoryUpload ✅ サポートされる
downloadDirectory(String, String, File) downloadDirectory( DownloadDirectoryRequest) MultipleFileDownloadDirectoryDownload ✅ サポートされる

再開可能な転送方法

V1 メソッド V2 メソッド 移行ステータス
resumeUpload(PersistableUpload) resumeUploadFile(ResumableFileUpload) ✅ サポートされる
resumeDownload(PersistableDownload) resumeDownloadFile(ResumableFileDownload) ✅ サポートされる

ライフサイクルメソッド

V1 メソッド V2 メソッド 移行ステータス
shutdownNow() close() ✅ サポートされる
shutdownNow(boolean) close() メソッドを使用してコードを手動で調整する ❌ サポートされていない

サポートされていない V1 クライアントメソッド

V1 メソッド V2 代替 メモ
abortMultipartUploads(String, Date) 低レベルの Amazon S3 クライアントを使用する ❌ サポートされていない
getAmazonS3Client() リファレンスを個別に保存する ❌ サポートされていない、v2 にゲッターがない
getConfiguration() リファレンスを個別に保存する ❌ サポートされていない、v2 にゲッターがない
uploadFileList(...) 複数のuploadFile()呼び出しを行う ❌ サポートされていない
copy TransferStateChangeListenerパラメータを持つ メソッド TransferListener を使用する 手動移行の例を参照してください。
download S3ProgressListenerパラメータを使用する メソッド TransferListener を使用する 手動移行の例を参照してください。

downloadDirectory 4 つ以上のパラメータを持つ メソッド

手動移行の例を参照してください。
upload ObjectMetadataProviderパラメータを使用した メソッド リクエストでメタデータを設定する 手動移行の例を参照してください。
uploadDirectory *Providerパラメータを含む メソッド リクエストでタグを設定する 手動移行の例を参照してください。

copyTransferStateChangeListenerパラメータを持つ メソッド

  • copy(CopyObjectRequest copyObjectRequest, AmazonS3 srcS3, TransferStateChangeListener stateChangeListener)

  • copy(CopyObjectRequest copyObjectRequest, TransferStateChangeListener stateChangeListener)

// V1 ---------------------------------------------------------------------------------------------- // Initialize source S3 client AmazonS3 s3client = AmazonS3ClientBuilder.standard() .withRegion("us-west-2") .build(); // Initialize Transfer Manager TransferManager tm = TransferManagerBuilder.standard() .withS3Client(srcS3) .build(); CopyObjectRequest copyObjectRequest = new CopyObjectRequest( "amzn-s3-demo-source-bucket", "source-key", "amzn-s3-demo-destination-bucket", "destination-key" ); TransferStateChangeListener stateChangeListener = new TransferStateChangeListener() { @Override public void transferStateChanged(Transfer transfer, TransferState state) { //Implementation of the TransferStateChangeListener } }; Copy copy = tm.copy(copyObjectRequest, srcS3, stateChangeListener); // V2 ---------------------------------------------------------------------------------------------- S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .region(Region.US_WEST_2) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build(); // Create transfer listener (equivalent to TransferStateChangeListener in v1) TransferListener transferListener = new TransferListener() { @Override public void transferInitiated(Context.TransferInitiated context) { //Implementation System.out.println("Transfer initiated"); } @Override public void bytesTransferred(Context.BytesTransferred context) { //Implementation System.out.println("Bytes transferred"); } @Override public void transferComplete(Context.TransferComplete context) { //Implementation System.out.println("Transfer completed!"); } @Override public void transferFailed(Context.TransferFailed context) { //Implementation System.out.println("Transfer failed"); } }; CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(req -> req .sourceBucket("amzn-s3-demo-source-bucket") .sourceKey("source-key") .destinationBucket("amzn-s3-demo-destination-bucket") .destinationKey("destination-key") ) .addTransferListener(transferListener) // Configure the transferListener into the request .build(); Copy copy = transferManager.copy(copyRequest);

downloadS3ProgressListenerパラメータを持つ メソッド

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener)

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis)

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis, boolean resumeOnRetry)

// V1 ---------------------------------------------------------------------------------------------- S3ProgressListener progressListener = new S3ProgressListener() { @Override public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) { long bytes = progressEvent.getBytesTransferred(); ProgressEventType eventType = progressEvent.getEventType(); // Use bytes and eventType as needed } @Override public void onPersistableTransfer(PersistableTransfer persistableTransfer) { } }; Download download1 = tm.download(getObjectRequest, file, progressListener); Download download2 = tm.download(getObjectRequest, file, progressListener, timeoutMillis) Download download3 = tm.download(getObjectRequest, file, progressListener, timeoutMillis, true) // V2 ---------------------------------------------------------------------------------------------- TransferListener transferListener = new TransferListener() { @Override public void transferInitiated(Context.InitializedContext context) { // Equivalent to ProgressEventType.TRANSFER_STARTED_EVENT System.out.println("Transfer initiated"); } @Override public void bytesTransferred(Context.BytesTransferred context) { // Equivalent to ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT long bytes = context.bytesTransferred(); System.out.println("Bytes transferred: " + bytes); } @Override public void transferComplete(Context.TransferComplete context) { // Equivalent to ProgressEventType.TRANSFER_COMPLETED_EVENT System.out.println("Transfer completed"); } @Override public void transferFailed(Context.TransferFailed context) { // Equivalent to ProgressEventType.TRANSFER_FAILED_EVENT System.out.println("Transfer failed: " + context.exception().getMessage()); } }; DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(getObjectRequest) .destination(file.toPath()) .addTransferListener(transferListener) .build(); // For download1 FileDownload download = transferManager.downloadFile(downloadFileRequest); // For download2 CompletedFileDownload completedFileDownload = download.completionFuture() .get(timeoutMillis, TimeUnit.MILLISECONDS); // For download3, the v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1. // If a download is interrupted, you need to start a new download request.

downloadDirectory 4 つ以上のパラメータを持つ メソッド

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry)

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry, KeyFilter filter)

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, KeyFilter filter)

// V1 ---------------------------------------------------------------------------------------------- KeyFilter filter = new KeyFilter() { @Override public boolean shouldInclude(S3ObjectSummary objectSummary) { //Filter implementation } }; MultipleFileDownload multipleFileDownload = tm.downloadDirectory(bucketName, keyPrefix, destinationDirectory, filter); // V2 ---------------------------------------------------------------------------------------------- // The v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1. // If a download is interrupted, you need to start a new download request. DownloadFilter filter = new DownloadFilter() { @Override public boolean test(S3Object s3Object) { // Filter implementation. } }; DownloadDirectoryRequest downloadDirectoryRequest = DownloadDirectoryRequest.builder() .bucket(bucketName) .filter(filter) .listObjectsV2RequestTransformer(builder -> builder.prefix(keyPrefix)) .destination(destinationDirectory.toPath()) .build(); DirectoryDownload directoryDownload = transferManager.downloadDirectory(downloadDirectoryRequest);

uploadObjectMetadataパラメータを含む メソッド

  • upload(String bucketName, String key, InputStream input, ObjectMetadata objectMetadata)

// V1 ----------------------------------------------------------------------------------------------ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("text/plain"); // System-defined metadata metadata.setContentLength(22L); // System-defined metadata metadata.addUserMetadata("myKey", "myValue"); // User-defined metadata PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, metadata); Upload upload = transferManager.upload("amzn-s3-demo-bucket", "my-key", inputStream, metadata); // V2 ---------------------------------------------------------------------------------------------- /* When you use an InputStream to upload in V2, you should specify the content length and use `RequestBody.fromInputStream()`. If you don't provide the content length, the entire stream will be buffered in memory. If you can't determine the content length, we recommend using the CRT-based S3 client. */ Map<String, String> userMetadata = new HashMap<>(); userMetadata.put("x-amz-meta-myKey", "myValue"); PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket("amzn-s3-demo-bucket1") .key("k") .contentType("text/plain") //System-defined metadata usually has separate methods in the builder. .contentLength(22L) .metadata(userMetadata) //metadata() is only for user-defined metadata. .build(); UploadRequest uploadRequest = UploadRequest.builder() .putObjectRequest(putObjectRequest) .requestBody(AsyncRequestBody.fromInputStream(stream, 22L, executor)) .build(); transferManager.upload(uploadRequest).completionFuture().join();

uploadDirectoryObjectMetadataProviderパラメータ付き

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider)

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider)

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider, ObjectCannedAclProvider cannedAclProvider)

// V1 ---------------------------------------------------------------------------------------------- tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider) tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider) tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider, cannedAclProvider) // V2 ---------------------------------------------------------------------------------------------- UploadDirectoryRequest request = UploadDirectoryRequest.builder() .bucket(bucketName) .s3Prefix(virtualDirectoryKeyPrefix) .source(directory.toPath()) .maxDepth(includeSubdirectories ? Integer.MAX_VALUE : 1) .uploadFileRequestTransformer(builder -> { // 1.Replace `ObjectMetadataProvider`, `ObjectTaggingProvider`, and `ObjectCannedAclProvider` with an // `UploadFileRequestTransformer` that can combine the functionality of all three *Provider implementations. // 2. Convert your v1 `ObjectMetadata` to v2 `PutObjectRequest` parameters. // 3. Convert your v1 `ObjectTagging` to v2 `Tagging`. // 4. Convert your v1 `CannedAccessControlList` to v2 `ObjectCannedACL`. }) .build(); DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);

モデルオブジェクトの移行

では AWS SDK for Java 2.x、多くのTransferManagerモデルオブジェクトが再設計されており、v1 のモデルオブジェクトで使用できるいくつかの getter メソッドと setter メソッドはサポートされなくなりました。

v2 では、 CompletableFuture<T> クラスを使用して、転送が完了したときに、正常に、または例外でアクションを実行できます。必要に応じて、 join()メソッドを使用して完了を待つことができます。

コア転送オブジェクト

V1 クラス V2 クラス 移行ステータス
TransferManager S3TransferManager ✅ サポートされる
TransferManagerBuilder S3TransferManager.Builder ✅ サポートされる
Transfer Transfer ✅ サポートされる
AbortableTransfer Transfer ✅ サポート (個別のクラスなし)
Copy Copy ✅ サポートされる
Download FileDownload ✅ サポートされる
Upload Upload / FileUpload ✅ サポートされる
MultipleFileDownload DirectoryDownload ✅ サポートされる
MultipleFileUpload DirectoryUpload ✅ サポートされる

永続オブジェクト

V1 クラス V2 クラス 移行ステータス
PersistableDownload ResumableFileDownload ✅ サポートされる
PersistableUpload ResumableFileUpload ✅ サポートされる
PersistableTransfer ResumableTransfer ✅ サポートされる
PauseResult<T> 直接再開可能なオブジェクト ❌ サポートされていない

結果オブジェクト

V1 クラス V2 クラス 移行ステータス
CopyResult CompletedCopy ✅ サポートされる
UploadResult CompletedUpload ✅ サポートされる

設定オブジェクト

V1 クラス V2 クラス 移行ステータス
TransferManagerConfiguration MultipartConfiguration (Amazon S3 クライアントの場合) ✅ サポートされる
TransferProgress TransferProgress + TransferProgressSnapshot ✅ サポートされる
KeyFilter DownloadFilter ✅ サポートされる

サポートされていないオブジェクト

V1 クラス V2 代替 移行ステータス
PauseStatus サポートされていません ❌ サポートされていない
UploadContext サポートされていません ❌ サポートされていない
ObjectCannedAclProvider PutObjectRequest.builder().acl() ❌ サポートされていない
ObjectMetadataProvider PutObjectRequest.builder().metadata() ❌ サポートされていない
ObjectTaggingProvider PutObjectRequest.builder().tagging() ❌ サポートされていない
PresignedUrlDownload サポートされていません ❌ サポートされていない

TransferManagerBuilder 設定の移行

設定変更

v2 Transfer Manager に設定する必要がある設定変更は、使用する S3 クライアントによって異なります。CRT AWS ベースの S3 クライアントまたは標準の Java ベースの S3 非同期クライアントを選択できます。相違点については、の S3 クライアント AWS SDK for Java 2.x「」トピックを参照してください。

Use the AWS CRT-based S3 client
設定 v1 v2 - AWS CRT ベースの S3 クライアントを使用した Transfer Manager

(ビルダーを入手する)

TransferManagerBuilder tmBuilder = TransferManagerBuilder.standard();
S3TransferManager.Builder tmBuilder = S3TransferManager.builder();

S3 クライアント

tmBuilder.withS3Client(...); tmBuilder.setS3Client(...);
tmBuilder.s3Client(...);

エグゼキュター

tmBuilder.withExecutorFactory(...); tmBuilder.setExecutorFactory(...);
tmBuilder.executor(...);

スレッドプールをシャットダウンする

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
サポート外。が閉じられている場合、指定されたエグゼキュターS3TransferManagerはシャットダウンされません

最小アップロードパートサイズ

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). minimumPartSizeInBytes(...).build(); tmBuilder.s3Client(s3);

マルチパートアップロードのしきい値

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). thresholdInBytes(...).build(); tmBuilder.s3Client(s3);

最小コピーパーツサイズ

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). minimumPartSizeInBytes(...).build(); tmBuilder.s3Client(s3);

マルチパートコピーのしきい値

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). thresholdInBytes(...).build(); tmBuilder.s3Client(s3);

並列ダウンロードを無効にする

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
マルチパートが無効 (デフォルト) の標準 Java ベースの S3 クライアントを転送マネージャーに渡して、並列ダウンロードを無効にします。
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

常にマルチパート md5 を計算する

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
サポート外。
Use Java-based S3 async client
設定 v1 v2 - Java ベースの S3 非同期クライアントを使用する Transfer Manager

(ビルダーを入手する)

TransferManagerBuilder tmBuilder = TransferManagerBuilder.standard();
S3TransferManager.Builder tmBuilder = S3TransferManager.builder();

S3 クライアント

tmBuilder.withS3Client(...); tmBuilder.setS3Client(...);
tmBuilder.s3Client(...);

エグゼキュター

tmBuilder.withExecutorFactory(...); tmBuilder.setExecutorFactory(...);
tmBuilder.executor(...);

スレッドプールをシャットダウンする

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
サポート外。が閉じられている場合、指定されたエグゼキュターS3TransferManagerはシャットダウンされません

最小アップロードパートサイズ

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.minimumPartSizeInBytes(...)).build(); tmBuilder.s3Client(s3);

マルチパートアップロードのしきい値

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.thresholdInBytes(...)).build(); tmBuilder.s3Client(s3);

最小コピーパーツサイズ

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.minimumPartSizeInBytes(...)).build(); tmBuilder.s3Client(s3);

マルチパートコピーのしきい値

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.thresholdInBytes(...)).build(); tmBuilder.s3Client(s3);

並列ダウンロードを無効にする

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
マルチパートが無効 (デフォルト) の標準 Java ベースの S3 クライアントを転送マネージャーに渡して、並列ダウンロードを無効にします。
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

常にマルチパート md5 を計算する

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
サポート外。

動作の変更

非同期オペレーション

V1 (ブロック):

Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file); upload.waitForCompletion(); // Blocks until complete

V2 (非同期):

FileUpload upload = transferManager.uploadFile(UploadFileRequest.builder() .putObjectRequest(PutObjectRequest.builder() .bucket("amzn-s3-demo-bucket") .key("key") .build()) .source(file) .build()); CompletedFileUpload result = upload.completionFuture().join(); // Blocks until complete // Or handle asynchronously: upload.completionFuture().thenAccept(result -> { System.out.println("Upload completed: " + result.response().eTag()); });

エラー処理

V1: サブリクエストが失敗した場合、ディレクトリ転送は完全に失敗します。

V2: 一部のサブリクエストが失敗しても、ディレクトリ転送は正常に完了します。エラーを明示的に確認します。

DirectoryUpload directoryUpload = transferManager.uploadDirectory(request); CompletedDirectoryUpload result = directoryUpload.completionFuture().join(); // Check for failed transfers if (!result.failedTransfers().isEmpty()) { System.out.println("Some uploads failed:"); result.failedTransfers().forEach(failed -> System.out.println("Failed: " + failed.exception().getMessage())); }

バイト範囲フェッチによる並列ダウンロード

v2 SDK で自動並列転送機能が有効になっている場合、S3 Transfer Manager はバイト範囲フェッチを使用してオブジェクトの特定部分を並列に取得します (マルチパートダウンロード)。v2 でのオブジェクトのダウンロード方法は、オブジェクトが最初にアップロードされた方法には依存しません。すべてのダウンロードで、高いスループットと同時実行性のメリットが得られます。

v1 の Transfer Manager とは対照的に、オブジェクトが最初にどのようにアップロードされたかは重要です。v1 Transfer Manager は、パートがアップロードされたのと同じ方法でオブジェクトのパートを取得します。オブジェクトが最初に単一のオブジェクトとしてアップロードされた場合、v1 Transfer Manager はサブリクエストを使用してダウンロードプロセスを高速化できません。