Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Eseguire la migrazione di Transfer Manager dalla versione 1 alla versione 2 di AWS SDK per Java
Questa guida alla migrazione illustra le principali differenze tra Transfer Manager v1 e S3 Transfer Manager v2, tra cui modifiche al costruttore, mappature dei metodi ed esempi di codice per operazioni comuni. Dopo aver esaminato queste differenze, puoi migrare correttamente il codice esistente di Transfer Manager per sfruttare le prestazioni migliorate e le operazioni asincrone della v2.
Informazioni sullo strumento di migrazione SDK AWS
AWS SDK per Java Fornisce uno strumento di migrazione automatizzato in grado di migrare gran parte dell'API v1 Transfer Manager alla v2. Tuttavia, lo strumento di migrazione non supporta diverse funzionalità di v1 Transfer Manager. In questi casi, è necessario migrare manualmente il codice di Transfer Manager seguendo le indicazioni riportate in questo argomento.
In questa guida, gli indicatori dello stato della migrazione mostrano se lo strumento di migrazione può migrare automaticamente un costruttore, un metodo o una funzionalità:
-
✅ Supportato: lo strumento di migrazione può trasformare automaticamente questo codice
-
❌ Non supportato: è necessario migrare manualmente il codice
Anche per gli elementi contrassegnati come «Supportati», esamina i risultati della migrazione ed esegui accuratamente i test. La migrazione di Transfer Manager comporta modifiche architetturali significative da operazioni sincrone a operazioni asincrone.
Panoramica
S3 Transfer Manager v2 introduce modifiche significative all'API Transfer Manager. S3 Transfer Manager v2 è basato su operazioni asincrone e offre prestazioni migliori, soprattutto quando si utilizza il client Amazon S3 basato su CRT. AWS
Differenze principali
-
Package:
com.amazonaws.services.s3.transfer
→software.amazon.awssdk.transfer.s3
-
Nome della classe:
TransferManager
→S3TransferManager
-
Dipendenza dal client: client Amazon S3 sincrono → Client Amazon S3 asincrono ()
S3AsyncClient
-
Architettura: operazioni sincrone → Operazioni asincrone con
CompletableFuture
-
Prestazioni: migliorate con il supporto client basato su CRT AWS
Modifiche di alto livello
Aspetto | V1 | V2 |
---|---|---|
Dipendenza da 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 (sincronizzazione) |
S3AsyncClient (asincrono) |
Tipi di restituzione | Operazioni di blocco | CompletableFuture<T> |
Dipendenze da Maven
V1 | V2 |
---|---|
|
|
1 Ultima versione
Migrazione di Client Constructor
Costruttori supportati (migrazione automatica)
Costruttore V1 | Equivalente a V2 | Stato migrazione |
---|---|---|
new TransferManager() |
S3TransferManager.create() |
✅ Supportato |
TransferManagerBuilder.
defaultTransferManager() |
S3TransferManager.create() |
✅ Supportato |
TransferManagerBuilder.
standard().build() |
S3TransferManager.builder().build() |
✅ Supportato |
new TransferManager(AWSCredentials) |
S3TransferManager.builder()
.s3Client(S3AsyncClient.builder()
.credentialsProvider(...).build())
.build() |
✅ Supportato |
new TransferManager(
AWSCredentialsProvider) |
S3TransferManager.builder()
.s3Client(S3AsyncClient.builder()
.credentialsProvider(...).build())
.build() |
✅ Supportato |
Costruttori non supportati (è richiesta la migrazione manuale)
Costruttore V1 | Equivalente a V2 | Note sulla migrazione |
---|---|---|
new TransferManager(AmazonS3) |
È richiesta la migrazione manuale | Crea un file S3AsyncClient separato |
new TransferManager(AmazonS3,
ExecutorService) |
È richiesta la migrazione manuale | Crea S3AsyncClient e configura un executor |
new TransferManager(AmazonS3,
ExecutorService, boolean) |
È richiesta la migrazione manuale | shutDownThreadPools parametro non supportato |
Esempi di migrazione manuale
Codice V1:
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
TransferManager transferManager = new TransferManager(s3Client);
Codice 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();
Migrazione del metodo client
Attualmente, lo strumento di migrazione supporta resumeUpload
metodi di base copy
download
upload
uploadDirectory
,downloadDirectory
,resumeDownload
,, e.
Metodi di trasferimento di base
Metodo V1 | Metodo V2 | Modifica del tipo di restituzione | Stato migrazione |
---|---|---|---|
upload(String, String, File) |
uploadFile(UploadFileRequest) |
Upload → FileUpload |
✅ Supportato |
upload(PutObjectRequest) |
upload(UploadRequest) |
Upload → Upload |
✅ Supportato |
download(String, String, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Supportato |
download(GetObjectRequest, File) |
downloadFile(DownloadFileRequest) |
Download → FileDownload |
✅ Supportato |
copy(String, String, String, String) |
copy(CopyRequest) |
Copy → Copy |
✅ Supportato |
copy(CopyObjectRequest) |
copy(CopyRequest) |
Copy → Copy |
✅ Supportato |
uploadDirectory(String, String,
File, boolean) |
uploadDirectory(
UploadDirectoryRequest) |
MultipleFileUpload →
DirectoryUpload |
✅ Supportato |
downloadDirectory(String, String, File) |
downloadDirectory(
DownloadDirectoryRequest) |
MultipleFileDownload →
DirectoryDownload |
✅ Supportato |
Metodi di trasferimento riutilizzabili
Metodo V1 | Metodo V2 | Stato migrazione |
---|---|---|
resumeUpload(PersistableUpload) |
resumeUploadFile(ResumableFileUpload) |
✅ Supportato |
resumeDownload(PersistableDownload) |
resumeDownloadFile(ResumableFileDownload) |
✅ Supportato |
Metodi del ciclo di vita
Metodo V1 | Metodo V2 | Stato migrazione |
---|---|---|
shutdownNow() |
close() |
✅ Supportato |
shutdownNow(boolean) |
Regola manualmente il codice utilizzando il close() metodo |
❌ Non supportato |
Metodi client V1 non supportati
Metodo V1 | Alternativa V2 | Note |
---|---|---|
abortMultipartUploads(String, Date) |
Usa il client Amazon S3 di basso livello | ❌ Non supportato |
getAmazonS3Client() |
Salva un riferimento separatamente | ❌ Non supportato; nessun getter nella v2 |
getConfiguration() |
Salva un riferimento separatamente | ❌ Non supportato; nessun getter nella v2 |
uploadFileList(...) |
Effettua più chiamate uploadFile() |
❌ Non supportato |
copy metodi con un TransferStateChangeListener parametro |
Utilizzare TransferListener |
Vedi esempio di migrazione manuale |
download metodi con un S3ProgressListener parametro |
Utilizzare TransferListener |
Vedi esempio di migrazione manuale |
|
Vedi esempio di migrazione manuale | |
upload metodo con un ObjectMetadataProvider parametro |
Imposta i metadati nella richiesta | Vedi esempio di migrazione manuale |
uploadDirectory metodi con *Provider parametro |
Imposta i tag nella richiesta | Vedi esempio di migrazione manuale |
copy
metodi con un TransferStateChangeListener
parametro
-
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
metodi con un S3ProgressListener
parametro
-
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
metodi con 4 o più parametri
-
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
metodo con ObjectMetadata
parametro
-
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
con ObjectMetadataProvider
parametro
-
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);
Migrazione degli oggetti del modello
Nel AWS SDK for Java 2.x, molti oggetti del TransferManager
modello sono stati riprogettati e diversi metodi getter e setter disponibili negli oggetti del modello v1 non sono più supportati.
Nella v2, è possibile utilizzare la CompletableFuture<T>
classe per eseguire azioni quando il trasferimento viene completato, con successo o con un'eccezione. È possibile utilizzare il join()
metodo per attendere il completamento, se necessario.
Oggetti di trasferimento principali
Classe V1 | Classe V2 | Stato migrazione |
---|---|---|
TransferManager |
S3TransferManager |
✅ Supportato |
TransferManagerBuilder |
S3TransferManager.Builder |
✅ Supportato |
Transfer |
Transfer |
✅ Supportato |
AbortableTransfer |
Transfer |
✅ Supportato (nessuna classe separata) |
Copy |
Copy |
✅ Supportato |
Download |
FileDownload |
✅ Supportato |
Upload |
Upload / FileUpload |
✅ Supportato |
MultipleFileDownload |
DirectoryDownload |
✅ Supportato |
MultipleFileUpload |
DirectoryUpload |
✅ Supportato |
Oggetti di persistenza
Classe V1 | Classe V2 | Stato migrazione |
---|---|---|
PersistableDownload |
ResumableFileDownload |
✅ Supportato |
PersistableUpload |
ResumableFileUpload |
✅ Supportato |
PersistableTransfer |
ResumableTransfer |
✅ Supportato |
PauseResult<T> |
Oggetto riutilizzabile direttamente | ❌ Non supportato |
Oggetti dei risultati
Classe V1 | Classe V2 | Stato migrazione |
---|---|---|
CopyResult |
CompletedCopy |
✅ Supportato |
UploadResult |
CompletedUpload |
✅ Supportato |
Oggetti di configurazione
Classe V1 | Classe V2 | Stato migrazione |
---|---|---|
TransferManagerConfiguration |
MultipartConfiguration (sul client Amazon S3) |
✅ Supportato |
TransferProgress |
TransferProgress + TransferProgressSnapshot |
✅ Supportato |
KeyFilter |
DownloadFilter |
✅ Supportato |
Oggetti non supportati
Classe V1 | Alternativa V2 | Stato migrazione |
---|---|---|
PauseStatus |
Non supportato | ❌ Non supportato |
UploadContext |
Non supportato | ❌ Non supportato |
ObjectCannedAclProvider |
PutObjectRequest.builder().acl() |
❌ Non supportato |
ObjectMetadataProvider |
PutObjectRequest.builder().metadata() |
❌ Non supportato |
ObjectTaggingProvider |
PutObjectRequest.builder().tagging() |
❌ Non supportato |
PresignedUrlDownload |
Non supportato | ❌ Non supportato |
TransferManagerBuilder migrazione della configurazione
Modifiche di configurazione
Le modifiche alla configurazione che devi impostare per il gestore di trasferimento v2 dipendono dal client S3 che utilizzi. Puoi scegliere tra il client S3 basato su AWS CRT o il client asincrono S3 standard basato su Java. Per informazioni sulle differenze, consulta l'argomento. Client S3 in AWS SDK for Java 2.x
Modifiche al comportamento
Operazioni asincrone
V1 (blocco):
Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file);
upload.waitForCompletion(); // Blocks until complete
V2 (asincrono):
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());
});
Gestione degli errori
V1: I trasferimenti di directory falliscono completamente se una richiesta secondaria fallisce.
V2: I trasferimenti di directory vengono completati correttamente anche se alcune richieste secondarie falliscono. Verifica la presenza di errori in modo esplicito:
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()));
}
Download parallelo tramite recuperi a intervalli di byte
Quando la funzionalità di trasferimento parallelo automatico è abilitata nell'SDK v2, S3 Transfer Manager utilizza recuperi a intervalli di byte per recuperare parti specifiche dell'oggetto in parallelo (download multipart). Il modo in cui un oggetto viene scaricato con v2 non dipende da come l'oggetto è stato originariamente caricato. Tutti i download possono trarre vantaggio da un throughput e da una concorrenza elevati.
Al contrario, con Transfer Manager della v1, è importante il modo in cui l'oggetto è stato originariamente caricato. Il v1 Transfer Manager recupera le parti dell'oggetto nello stesso modo in cui le parti sono state caricate. Se un oggetto è stato originariamente caricato come oggetto singolo, v1 Transfer Manager non è in grado di accelerare il processo di download utilizzando richieste secondarie.