Migrieren Sie den Transfer Manager von Version 1 auf Version 2 von AWS SDK für Java - AWS SDK for Java 2.x

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Migrieren Sie den Transfer Manager von Version 1 auf Version 2 von AWS SDK für Java

Dieser Migrationsleitfaden behandelt die wichtigsten Unterschiede zwischen Transfer Manager v1 und S3 Transfer Manager v2, einschließlich Konstruktoränderungen, Methodenzuordnungen und Codebeispiele für allgemeine Operationen. Nachdem Sie diese Unterschiede überprüft haben, können Sie Ihren vorhandenen Transfer Manager-Code erfolgreich migrieren, um von der verbesserten Leistung und den asynchronen Vorgängen in Version 2 zu profitieren.

Über das AWS SDK-Migrationstool

Das AWS SDK für Java bietet ein automatisiertes Migrationstool, mit dem ein Großteil der v1 Transfer Manager-API auf Version 2 migriert werden kann. Das Migrationstool unterstützt jedoch nicht mehrere v1-Transfer-Manager-Funktionen. In diesen Fällen müssen Sie den Transfer Manager-Code anhand der Anleitung in diesem Thema manuell migrieren.

In diesem Handbuch zeigen Indikatoren für den Migrationsstatus, ob das Migrationstool einen Konstruktor, eine Methode oder ein Feature automatisch migrieren kann:

  • ✅ Unterstützt: Das Migrationstool kann diesen Code automatisch transformieren

  • ❌ Nicht unterstützt: Sie müssen den Code manuell migrieren

Überprüfen Sie auch bei Elementen, die als „Unterstützt“ gekennzeichnet sind, die Migrationsergebnisse und testen Sie sie gründlich. Die Transfer Manager-Migration beinhaltet erhebliche architektonische Änderungen von synchronen zu asynchronen Vorgängen.

Übersicht

S3 Transfer Manager v2 führt wichtige Änderungen an der Transfer Manager-API ein. S3 Transfer Manager v2 basiert auf asynchronen Vorgängen und bietet eine bessere Leistung, insbesondere wenn Sie den AWS CRT-basierten Amazon S3 S3-Client verwenden.

Die wichtigsten Unterschiede:

  • Package: com.amazonaws.services.s3.transfersoftware.amazon.awssdk.transfer.s3

  • Klassenname: TransferManagerS3TransferManager

  • Kundenabhängigkeit: Synchroner Amazon S3 S3-Client → Asynchroner Amazon S3 S3-Client () S3AsyncClient

  • Architektur: Synchrone Operationen → Asynchrone Operationen mit CompletableFuture

  • Leistung: Verbessert durch AWS CRT-basierte Client-Unterstützung

Änderungen auf hoher Ebene

Aspekt V1 V2
Abhängigkeit von Maven aws-java-sdk-s3 s3-transfer-manager
Package com.amazonaws.services.s3.transfer software.amazon.awssdk.transfer.s3
Hauptklasse TransferManager S3TransferManager
Amazon S3 S3-Klient AmazonS3(synchronisieren) S3AsyncClient(asynchron)
Rückgabetypen Blockieren von Vorgängen CompletableFuture<T>

Maven-Abhängigkeiten

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 Letzte Version. 2 Letzte Version. 3 Letzte Version.

Migration des Client-Konstruktors

Unterstützte Konstruktoren (automatische Migration)

V1-Konstruktor V2-Äquivalent Migrationsstatus
new TransferManager() S3TransferManager.create() ✅ Unterstützt
TransferManagerBuilder. defaultTransferManager() S3TransferManager.create() ✅ Unterstützt
TransferManagerBuilder. standard().build() S3TransferManager.builder().build() ✅ Unterstützt
new TransferManager(AWSCredentials) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ Unterstützt
new TransferManager( AWSCredentialsProvider) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ Unterstützt

Konstruktoren werden nicht unterstützt (manuelle Migration erforderlich)

V1-Konstruktor V2-Äquivalent Hinweise zur Migration
new TransferManager(AmazonS3) Manuelle Migration erforderlich Erstellen Sie ein S3AsyncClient separates
new TransferManager(AmazonS3, ExecutorService) Manuelle Migration erforderlich Erstellen Sie einen S3AsyncClient Executor und konfigurieren Sie ihn
new TransferManager(AmazonS3, ExecutorService, boolean) Manuelle Migration erforderlich shutDownThreadPoolsParameter wird nicht unterstützt

Beispiele für manuelle Migrationen

V1-Code:

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

V2-Kode:

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

Migration der Client-Methode

Derzeit unterstützt das Migrationstool grundlegende copydownload,upload,uploadDirectory,downloadDirectory,resumeDownload, und resumeUpload Methoden.

Wichtigste Übertragungsmethoden

V1-Methode V2-Methode Änderung des Rückgabetyps Migrationsstatus
upload(String, String, File) uploadFile(UploadFileRequest) UploadFileUpload ✅ Unterstützt
upload(PutObjectRequest) upload(UploadRequest) UploadUpload ✅ Unterstützt
download(String, String, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ Unterstützt
download(GetObjectRequest, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ Unterstützt
copy(String, String, String, String) copy(CopyRequest) CopyCopy ✅ Unterstützt
copy(CopyObjectRequest) copy(CopyRequest) CopyCopy ✅ Unterstützt
uploadDirectory(String, String, File, boolean) uploadDirectory( UploadDirectoryRequest) MultipleFileUploadDirectoryUpload ✅ Unterstützt
downloadDirectory(String, String, File) downloadDirectory( DownloadDirectoryRequest) MultipleFileDownloadDirectoryDownload ✅ Unterstützt

Wiederaufnehmbare Übertragungsmethoden

V1-Methode V2-Methode Migrationsstatus
resumeUpload(PersistableUpload) resumeUploadFile(ResumableFileUpload) ✅ Unterstützt
resumeDownload(PersistableDownload) resumeDownloadFile(ResumableFileDownload) ✅ Unterstützt

Lebenszyklus-Methoden

V1-Methode V2-Methode Migrationsstatus
shutdownNow() close() ✅ Unterstützt
shutdownNow(boolean) Passen Sie den Code mithilfe der close() Methode manuell an ❌ Nicht unterstützt

Nicht unterstützte V1-Client-Methoden

V1-Methode V2-Alternative Hinweise
abortMultipartUploads(String, Date) Verwenden Sie den Amazon S3 S3-Client auf niedriger Ebene ❌ Wird nicht unterstützt
getAmazonS3Client() Speichern Sie eine Referenz separat ❌ Nicht unterstützt; kein Getter in v2
getConfiguration() Speichern Sie eine Referenz separat ❌ Nicht unterstützt; kein Getter in v2
uploadFileList(...) Tätigen Sie mehrere Anrufe uploadFile() ❌ Nicht unterstützt
copyMethoden mit einem TransferStateChangeListener Parameter Verwenden von TransferListener Siehe Beispiel für eine manuelle Migration
downloadMethoden mit einem S3ProgressListener Parameter Verwenden von TransferListener Siehe Beispiel für eine manuelle Migration

downloadDirectoryMethoden mit 4 oder mehr Parametern

Siehe Beispiel für eine manuelle Migration
uploadMethode mit einem ObjectMetadataProvider Parameter Legen Sie Metadaten in der Anfrage fest Siehe Beispiel für eine manuelle Migration
uploadDirectoryMethoden mit *Provider Parametern Legen Sie Tags auf Anfrage fest Siehe Beispiel für eine manuelle Migration

copyMethoden mit einem TransferStateChangeListener Parameter

  • 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);

downloadMethoden mit einem S3ProgressListener Parameter

  • 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.

downloadDirectoryMethoden mit 4 oder mehr Parametern

  • 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);

uploadMethode mit ObjectMetadata Parameter

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

uploadDirectorymit ObjectMetadataProvider Parameter

  • 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);

Migration von Modellobjekten

In AWS SDK for Java 2.x wurden viele TransferManager Modellobjekte neu gestaltet, und mehrere Getter- und Setter-Methoden, die in den Modellobjekten von Version 1 verfügbar sind, werden nicht mehr unterstützt.

In Version 2 können Sie die CompletableFuture<T> Klasse verwenden, um Aktionen auszuführen, wenn die Übertragung abgeschlossen wurde — entweder erfolgreich oder mit einer Ausnahme. Sie können die join() Methode verwenden, um bei Bedarf auf den Abschluss zu warten.

Kernübertragungsobjekte

Klasse V1 V2-Klasse Migrationsstatus
TransferManager S3TransferManager ✅ Unterstützt
TransferManagerBuilder S3TransferManager.Builder ✅ Unterstützt
Transfer Transfer ✅ Unterstützt
AbortableTransfer Transfer ✅ Unterstützt (keine separate Klasse)
Copy Copy ✅ Unterstützt
Download FileDownload ✅ Unterstützt
Upload Upload / FileUpload ✅ Unterstützt
MultipleFileDownload DirectoryDownload ✅ Unterstützt
MultipleFileUpload DirectoryUpload ✅ Unterstützt

Persistenz-Objekte

Klasse V1 V2-Klasse Migrationsstatus
PersistableDownload ResumableFileDownload ✅ Unterstützt
PersistableUpload ResumableFileUpload ✅ Unterstützt
PersistableTransfer ResumableTransfer ✅ Unterstützt
PauseResult<T> Direkt wiederaufnehmbares Objekt ❌ Wird nicht unterstützt

Ergebnisobjekte

Klasse V1 V2-Klasse Migrationsstatus
CopyResult CompletedCopy ✅ Unterstützt
UploadResult CompletedUpload ✅ Unterstützt

Konfigurationsobjekte

Klasse V1 V2-Klasse Migrationsstatus
TransferManagerConfiguration MultipartConfiguration(auf dem Amazon S3 S3-Client) ✅ Wird unterstützt
TransferProgress TransferProgress + TransferProgressSnapshot ✅ Unterstützt
KeyFilter DownloadFilter ✅ Unterstützt

Nicht unterstützte Objekte

Klasse V1 Alternative V2 Migrationsstatus
PauseStatus Nicht unterstützt ❌ Nicht unterstützt
UploadContext Nicht unterstützt ❌ Nicht unterstützt
ObjectCannedAclProvider PutObjectRequest.builder().acl() ❌ Nicht unterstützt
ObjectMetadataProvider PutObjectRequest.builder().metadata() ❌ Nicht unterstützt
ObjectTaggingProvider PutObjectRequest.builder().tagging() ❌ Nicht unterstützt
PresignedUrlDownload Nicht unterstützt ❌ Nicht unterstützt

TransferManagerBuilder Migration der Konfiguration

Konfigurationsänderungen

Die Konfigurationsänderungen, die Sie für den v2-Transfermanager vornehmen müssen, hängen davon ab, welchen S3-Client Sie verwenden. Sie haben die Wahl zwischen dem AWS CRT-basierten S3-Client oder dem standardmäßigen, auf Java basierenden asynchronen S3-Client. Informationen zu den Unterschieden finden Sie im Thema. S3-Clients in der AWS SDK for Java 2.x

Use the AWS CRT-based S3 client
Einstellung v1 v2 — Transfer Manager mit AWS CRT-basiertem S3-Client

(hol dir einen Builder)

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

S3-Klient

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

Testamentsvollstrecker

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

Threadpools herunterfahren

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird

Minimale Größe des Upload-Teils

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

Schwellenwert für mehrteiliges Hochladen

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

Minimale Größe des Kopierteils

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

Schwellenwert für mehrteiliges Kopieren

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

parallel Downloads deaktivieren

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

Berechne immer mehrteiliges MD5

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
Nicht unterstützt
Use Java-based S3 async client
Einstellung v1 v2 — Transfer Manager mit einem Java-basierten asynchronen S3-Client

(hol dir einen Builder)

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

S3-Klient

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

Testamentsvollstrecker

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

Threadpools herunterfahren

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird

Minimale Größe des Upload-Teils

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

Schwellenwert für mehrteiliges Hochladen

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

Minimale Größe des Kopierteils

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

Schwellenwert für mehrteiliges Kopieren

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

parallel Downloads deaktivieren

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

Berechne immer mehrteiliges MD5

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
Nicht unterstützt

Das Verhalten ändert sich

Asynchrone Operationen

V1 (blockierend):

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

V2 (asynchron):

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

Fehlerbehandlung

V1: Verzeichnisübertragungen schlagen vollständig fehl, wenn eine Unteranforderung fehlschlägt.

V2: Verzeichnisübertragungen werden erfolgreich abgeschlossen, auch wenn einige Unteranfragen fehlschlagen. Explizit nach Fehlern suchen:

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

Paralleler Download über Bytebereichs-Abrufe

Wenn die automatische parallele Übertragung im v2-SDK aktiviert ist, verwendet der S3 Transfer Manager Bytebereichs-Abrufe, um bestimmte Teile des Objekts parallel abzurufen (mehrteiliger Download). Die Art und Weise, wie ein Objekt mit Version 2 heruntergeladen wird, hängt nicht davon ab, wie das Objekt ursprünglich hochgeladen wurde. Alle Downloads können von hohem Durchsatz und Parallelität profitieren.

Im Gegensatz dazu spielt es beim Transfer Manager von Version 1 eine Rolle, wie das Objekt ursprünglich hochgeladen wurde. Der v1-Transfermanager ruft die Teile des Objekts auf die gleiche Weise ab, wie die Teile hochgeladen wurden. Wenn ein Objekt ursprünglich als einzelnes Objekt hochgeladen wurde, ist der v1 Transfer Manager nicht in der Lage, den Download-Vorgang mithilfe von Unteranforderungen zu beschleunigen.