Eseguire la migrazione di Transfer Manager dalla versione 1 alla versione 2 di AWS SDK per Java - AWS SDK for Java 2.x

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.transfersoftware.amazon.awssdk.transfer.s3

  • Nome della classe: TransferManagerS3TransferManager

  • 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
<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 Ultima versione. 2 Ultima versione. 3 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 shutDownThreadPoolsparametro 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 uploaduploadDirectory,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) UploadFileUpload ✅ Supportato
upload(PutObjectRequest) upload(UploadRequest) UploadUpload ✅ Supportato
download(String, String, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ Supportato
download(GetObjectRequest, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ Supportato
copy(String, String, String, String) copy(CopyRequest) CopyCopy ✅ Supportato
copy(CopyObjectRequest) copy(CopyRequest) CopyCopy ✅ Supportato
uploadDirectory(String, String, File, boolean) uploadDirectory( UploadDirectoryRequest) MultipleFileUploadDirectoryUpload ✅ Supportato
downloadDirectory(String, String, File) downloadDirectory( DownloadDirectoryRequest) MultipleFileDownloadDirectoryDownload ✅ 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
copymetodi con un TransferStateChangeListener parametro Utilizzare TransferListener Vedi esempio di migrazione manuale
downloadmetodi con un S3ProgressListener parametro Utilizzare TransferListener Vedi esempio di migrazione manuale

downloadDirectorymetodi con 4 o più parametri

Vedi esempio di migrazione manuale
uploadmetodo con un ObjectMetadataProvider parametro Imposta i metadati nella richiesta Vedi esempio di migrazione manuale
uploadDirectorymetodi con *Provider parametro Imposta i tag nella richiesta Vedi esempio di migrazione manuale

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

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

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

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

uploadDirectorycon 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

Use the AWS CRT-based S3 client
Impostazione v1 v2 - Transfer Manager che utilizza un client S3 basato su AWS CRT

(procurati un costruttore)

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

Client S3

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

Esecutore

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

Chiudi i pool di thread

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager

Dimensione minima della parte da caricare

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

Soglia di caricamento in più parti

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

Dimensione minima della parte di copia

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

Soglia di copia in più parti

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

Disattiva i download paralleli

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

Calcola sempre md5 multipart

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
Non supportato.
Use Java-based S3 async client
Impostazione v1 v2 - Transfer Manager che utilizza un client asincrono S3 basato su Java

(procurati un costruttore)

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

Client S3

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

Esecutore

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

Chiudi i pool di thread

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager

Dimensione minima della parte da caricare

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

Soglia di caricamento in più parti

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

Dimensione minima della parte di copia

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

Soglia di copia in più parti

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

Disattiva i download paralleli

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

Calcola sempre md5 multipart

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
Non supportato.

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.