Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Migrez le gestionnaire de transfert de la version 1 à la version 2 du AWS SDK pour Java
Ce guide de migration décrit les principales différences entre Transfer Manager v1 et S3 Transfer Manager v2, notamment les modifications du constructeur, les mappages de méthodes et des exemples de code pour les opérations courantes. Après avoir examiné ces différences, vous pouvez migrer avec succès votre code Transfer Manager existant afin de tirer parti des performances améliorées et des opérations asynchrones de la version 2.
À propos de l' AWS outil de migration du SDK
AWS SDK pour Java Il fournit un outil de migration automatique qui peut migrer une grande partie de l'API Transfer Manager v1 vers la v2. Cependant, l'outil de migration ne prend pas en charge plusieurs fonctionnalités de la version 1 de Transfer Manager. Dans ces cas, vous devez migrer manuellement le code de Transfer Manager en suivant les instructions de cette rubrique.
Tout au long de ce guide, les indicateurs de statut de migration indiquent si l'outil de migration peut migrer automatiquement un constructeur, une méthode ou une fonctionnalité :
-
✅ Supporté : l'outil de migration peut transformer automatiquement ce code
-
❌ Non pris en charge : vous devez migrer le code manuellement
Même pour les éléments marqués comme « pris en charge », passez en revue les résultats de la migration et testez-les de manière approfondie. La migration de Transfer Manager implique des modifications architecturales importantes, passant d'opérations synchrones à des opérations asynchrones.
Présentation
S3 Transfer Manager v2 apporte des modifications importantes à l'API Transfer Manager. S3 Transfer Manager v2 repose sur des opérations asynchrones et offre de meilleures performances, en particulier lorsque vous utilisez le client AWS Amazon S3 basé sur CRT.
Principales différences
-
Package :
com.amazonaws.services.s3.transfer
→software.amazon.awssdk.transfer.s3
-
Nom de la classe :
TransferManager
→S3TransferManager
-
Dépendance du client : client Amazon S3 synchrone → client Amazon S3 asynchrone ()
S3AsyncClient
-
Architecture : Opérations synchrones → Opérations asynchrones avec
CompletableFuture
-
Performances : améliorées grâce au support AWS client basé sur CRT
Changements de haut niveau
Aspect | V1 | V2 |
---|---|---|
Dépendance à Maven | aws-java-sdk-s3 |
s3-transfer-manager |
Package | com.amazonaws.services.s3.transfer |
software.amazon.awssdk.transfer.s3 |
Classe principale | TransferManager |
S3TransferManager |
Client Amazon S3 | AmazonS3 (synchronisation) |
S3AsyncClient (asynchrone) |
Types de retours | Opérations de blocage | CompletableFuture<T> |
Dépendances de Maven
V1 | V2 |
---|---|
|
|
1 Dernière version
Migration du constructeur client
Constructeurs pris en charge (migration automatique)
Constructeur V1 | équivalent V2 | État de la migration |
---|---|---|
new TransferManager() |
S3TransferManager.create() |
✅ Soutenu |
TransferManagerBuilder.
defaultTransferManager() |
S3TransferManager.create() |
✅ Soutenu |
TransferManagerBuilder.
standard().build() |
S3TransferManager.builder().build() |
✅ Soutenu |
new TransferManager(AWSCredentials) |
S3TransferManager.builder()
.s3Client(S3AsyncClient.builder()
.credentialsProvider(...).build())
.build() |
✅ Soutenu |
new TransferManager(
AWSCredentialsProvider) |
S3TransferManager.builder()
.s3Client(S3AsyncClient.builder()
.credentialsProvider(...).build())
.build() |
✅ Soutenu |
Constructeurs non pris en charge (migration manuelle requise)
Constructeur V1 | équivalent V2 | Remarques sur la migration |
---|---|---|
new TransferManager(AmazonS3) |
Migration manuelle requise | Créez un S3AsyncClient séparément |
new TransferManager(AmazonS3,
ExecutorService) |
Migration manuelle requise | Création S3AsyncClient et configuration d'un exécuteur |
new TransferManager(AmazonS3,
ExecutorService, boolean) |
Migration manuelle requise | shutDownThreadPools paramètre non pris en charge |
Exemples de migration manuelle
Code V1 :
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
TransferManager transferManager = new TransferManager(s3Client);
Code 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();
Migration de la méthode client
Actuellement, l'outil de migration prend en charge les resumeUpload
méthodes de base copy
download
upload
uploadDirectory
downloadDirectory
,resumeDownload
,,, et.
Méthodes de transfert de base
Méthode V1 | Méthode V2 | Changement de type de retour | État de la migration |
---|---|---|---|
upload(String, String, File) |
uploadFile(UploadFileRequest) |
Upload → FileUpload |
✅ Soutenu |
upload(PutObjectRequest) |
upload(UploadRequest) |
Upload → Upload |
✅ Soutenu |
download(String, String, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Soutenu |
download(GetObjectRequest, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Soutenu |
copy(String, String, String, String) |
copy(CopyRequest) |
Copy → Copy |
✅ Soutenu |
copy(CopyObjectRequest) |
copy(CopyRequest) |
Copy → Copy |
✅ Soutenu |
uploadDirectory(String, String,
File, boolean) |
uploadDirectory(
UploadDirectoryRequest) |
MultipleFileUpload →
DirectoryUpload |
✅ Soutenu |
downloadDirectory(String, String, File) |
downloadDirectory(
DownloadDirectoryRequest) |
MultipleFileDownload →
DirectoryDownload |
✅ Soutenu |
Méthodes de transfert pouvant être reprises
Méthode V1 | Méthode V2 | État de la migration |
---|---|---|
resumeUpload(PersistableUpload) |
resumeUploadFile(ResumableFileUpload) |
✅ Soutenu |
resumeDownload(PersistableDownload) |
resumeDownloadFile(ResumableFileDownload) |
✅ Soutenu |
Méthodes de cycle de vie
Méthode V1 | Méthode V2 | État de la migration |
---|---|---|
shutdownNow() |
close() |
✅ Soutenu |
shutdownNow(boolean) |
Ajustez manuellement le code à l'aide de la close() méthode |
❌ Non pris en charge |
Méthodes client V1 non prises en charge
Méthode V1 | Alternative V2 | Remarques |
---|---|---|
abortMultipartUploads(String, Date) |
Utiliser le client Amazon S3 de bas niveau | ❌ Non pris en charge |
getAmazonS3Client() |
Enregistrer une référence séparément | ❌ Non pris en charge ; aucun getter dans la version 2 |
getConfiguration() |
Enregistrer une référence séparément | ❌ Non pris en charge ; aucun getter dans la version 2 |
uploadFileList(...) |
Passez plusieurs uploadFile() appels |
❌ Non pris en charge |
copy méthodes avec un TransferStateChangeListener paramètre |
Utiliser TransferListener |
Voir l'exemple de migration manuelle |
download méthodes avec S3ProgressListener paramètre |
Utiliser TransferListener |
Voir l'exemple de migration manuelle |
|
Voir l'exemple de migration manuelle | |
upload méthode avec ObjectMetadataProvider paramètre |
Définir les métadonnées dans la demande | Voir l'exemple de migration manuelle |
uploadDirectory méthodes avec *Provider paramètre |
Définir les tags dans la demande | Voir l'exemple de migration manuelle |
copy
méthodes avec un TransferStateChangeListener
paramètre
-
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
méthodes avec S3ProgressListener
paramètre
-
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
méthodes avec 4 paramètres ou plus
-
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
méthode avec ObjectMetadata
paramètre
-
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
avec ObjectMetadataProvider
paramètre
-
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 d'objets du modèle
En AWS SDK for Java 2.x, de nombreux objets du TransferManager
modèle ont été redessinés et plusieurs méthodes getter et setter disponibles dans les objets modèle de la version 1 ne sont plus prises en charge.
Dans la version 2, vous pouvez utiliser la CompletableFuture<T>
classe pour effectuer des actions une fois le transfert terminé, que ce soit avec succès ou avec une exception. Vous pouvez utiliser join()
cette méthode pour attendre la fin si nécessaire.
Objets de transfert principaux
Classe V1 | Classe V2 | État de la migration |
---|---|---|
TransferManager |
S3TransferManager |
✅ Soutenu |
TransferManagerBuilder |
S3TransferManager.Builder |
✅ Soutenu |
Transfer |
Transfer |
✅ Soutenu |
AbortableTransfer |
Transfer |
✅ Supporté (pas de classe séparée) |
Copy |
Copy |
✅ Soutenu |
Download |
FileDownload |
✅ Soutenu |
Upload |
Upload / FileUpload |
✅ Soutenu |
MultipleFileDownload |
DirectoryDownload |
✅ Soutenu |
MultipleFileUpload |
DirectoryUpload |
✅ Soutenu |
Objets de persistance
Classe V1 | Classe V2 | État de la migration |
---|---|---|
PersistableDownload |
ResumableFileDownload |
✅ Soutenu |
PersistableUpload |
ResumableFileUpload |
✅ Soutenu |
PersistableTransfer |
ResumableTransfer |
✅ Soutenu |
PauseResult<T> |
Objet directement réutilisable | ❌ Non pris en charge |
Objets de résultat
Classe V1 | Classe V2 | État de la migration |
---|---|---|
CopyResult |
CompletedCopy |
✅ Soutenu |
UploadResult |
CompletedUpload |
✅ Soutenu |
Objets de configuration
Classe V1 | Classe V2 | État de la migration |
---|---|---|
TransferManagerConfiguration |
MultipartConfiguration (sur le client Amazon S3) |
✅ Soutenu |
TransferProgress |
TransferProgress + TransferProgressSnapshot |
✅ Soutenu |
KeyFilter |
DownloadFilter |
✅ Soutenu |
Objets non pris en charge
Classe V1 | Alternative V2 | État de la migration |
---|---|---|
PauseStatus |
Non pris en charge | ❌ Non pris en charge |
UploadContext |
Non pris en charge | ❌ Non pris en charge |
ObjectCannedAclProvider |
PutObjectRequest.builder().acl() |
❌ Non pris en charge |
ObjectMetadataProvider |
PutObjectRequest.builder().metadata() |
❌ Non pris en charge |
ObjectTaggingProvider |
PutObjectRequest.builder().tagging() |
❌ Non pris en charge |
PresignedUrlDownload |
Non pris en charge | ❌ Non pris en charge |
TransferManagerBuilder migration de configuration
Configuration changes
Les modifications de configuration que vous devez définir pour le gestionnaire de transfert v2 dépendent du client S3 que vous utilisez. Vous avez le choix entre le client S3 AWS basé sur CRT ou le client asynchrone S3 standard basé sur Java. Pour plus d'informations sur les différences, consultez la clients S3 dans le AWS SDK for Java 2.x rubrique.
Changements de comportement
Opérations asynchrones
V1 (blocage) :
Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file);
upload.waitForCompletion(); // Blocks until complete
V2 (asynchrone) :
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());
});
Gestion des erreurs
V1 : Les transferts de répertoire échouent complètement si une sous-requête échoue.
V2 : Les transferts de répertoire se terminent avec succès même si certaines sous-requêtes échouent. Vérifiez les erreurs de manière explicite :
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()));
}
Téléchargement parallèle via des extractions par plage d'octets
Lorsque la fonction de transfert parallèle automatique est activée dans le SDK v2, le gestionnaire de transfert S3 utilise des extractions par plage d'octets pour récupérer des parties spécifiques de l'objet en parallèle (téléchargement en plusieurs parties). La façon dont un objet est téléchargé avec la version v2 ne dépend pas de la manière dont l'objet a été initialement chargé. Tous les téléchargements peuvent bénéficier d'un débit élevé et d'une simultanéité.
En revanche, avec le gestionnaire de transfert de la version 1, la manière dont l'objet a été initialement chargé est importante. Le gestionnaire de transfert v1 récupère les parties de l'objet de la même manière que les parties ont été téléchargées. Si un objet a été initialement chargé en tant qu'objet unique, le gestionnaire de transfert v1 n'est pas en mesure d'accélérer le processus de téléchargement en utilisant des sous-requêtes.