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.transfer
→software.amazon.awssdk.transfer.s3
-
Klassenname:
TransferManager
→S3TransferManager
-
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 |
---|---|
|
|
1 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 | shutDownThreadPools Parameter 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 copy
download
,upload
,uploadDirectory
,downloadDirectory
,resumeDownload
, und resumeUpload
Methoden.
Wichtigste Übertragungsmethoden
V1-Methode | V2-Methode | Änderung des Rückgabetyps | Migrationsstatus |
---|---|---|---|
upload(String, String, File) |
uploadFile(UploadFileRequest) |
Upload → FileUpload |
✅ Unterstützt |
upload(PutObjectRequest) |
upload(UploadRequest) |
Upload → Upload |
✅ Unterstützt |
download(String, String, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Unterstützt |
download(GetObjectRequest, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Unterstützt |
copy(String, String, String, String) |
copy(CopyRequest) |
Copy → Copy |
✅ Unterstützt |
copy(CopyObjectRequest) |
copy(CopyRequest) |
Copy → Copy |
✅ Unterstützt |
uploadDirectory(String, String,
File, boolean) |
uploadDirectory(
UploadDirectoryRequest) |
MultipleFileUpload →
DirectoryUpload |
✅ Unterstützt |
downloadDirectory(String, String, File) |
downloadDirectory(
DownloadDirectoryRequest) |
MultipleFileDownload →
DirectoryDownload |
✅ 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 |
copy Methoden mit einem TransferStateChangeListener Parameter |
Verwenden von TransferListener |
Siehe Beispiel für eine manuelle Migration |
download Methoden mit einem S3ProgressListener Parameter |
Verwenden von TransferListener |
Siehe Beispiel für eine manuelle Migration |
|
Siehe Beispiel für eine manuelle Migration | |
upload Methode mit einem ObjectMetadataProvider Parameter |
Legen Sie Metadaten in der Anfrage fest | Siehe Beispiel für eine manuelle Migration |
uploadDirectory Methoden mit *Provider Parametern |
Legen Sie Tags auf Anfrage fest | Siehe Beispiel für eine manuelle Migration |
copy
Methoden 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);
download
Methoden 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.
downloadDirectory
Methoden 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);
upload
Methode 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();
uploadDirectory
mit 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
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.