

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
<a name="migration-s3-transfer-manager"></a>

Questa guida alla migrazione illustra le principali differenze tra Transfer Manager v1 e S3 Transfer Manager v2, incluse le modifiche al costruttore, le mappature dei metodi e gli esempi di codice per le operazioni più 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](migration-tool.md) 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, **lo stato della migrazione** mostra 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 di
<a name="s3-tm-migration-overview"></a>

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
<a name="s3-tm-migration-key-differences"></a>
+ **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
<a name="s3-tm-migration-high-level-changes"></a>


| Aspetto | V1 | V2 | 
| --- | --- | --- | 
| Dipendenza da Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Pacchetto | 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
<a name="s3-tm-migration-dependencies"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>>1.12.7871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.31.682</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-transfer-manager</artifactId><br />    </dependency><br />    <!-- Optional: For enhanced performance with AWS CRT --><br />    <dependency><br />        <groupId>software.amazon.awssdk.crt</groupId><br />        <artifactId>aws-crt</artifactId><br />        <version>0.38.53</version><br />    </dependency><br /></dependencies></pre>  | 

1 [Ultima versione](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migrazione di Client Constructor
<a name="s3-tm-migration-client-constructor"></a>

### Costruttori supportati (migrazione automatica)
<a name="s3-tm-migration-supported-constructors"></a>


| Costruttore V1 | Equivalente a V2 | Stato migrazione | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Supportata | 
| 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() | Supportata | 

### Costruttori non supportati (è richiesta la migrazione manuale)
<a name="s3-tm-migration-unsupported-constructors"></a>


| 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
<a name="s3-tm-migration-manual-examples"></a>

**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
<a name="s3-tm-migration-client-methods"></a>

Attualmente, lo strumento di migrazione supporta `resumeUpload` metodi di base `copy` `download` `upload``uploadDirectory`,`downloadDirectory`,`resumeDownload`,, e.

### Metodi di trasferimento di base
<a name="s3-tm-migration-core-transfer-methods"></a>


| Metodo V1 | Metodo V2 | Modifica del tipo di restituzione | Stato migrazione | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Supportata | 
| 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 | Supportata | 

### Metodi di trasferimento riutilizzabili
<a name="s3-tm-migration-resumable-methods"></a>


| Metodo V1 | Metodo V2 | Stato migrazione | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Supportata | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Supportata | 

### Metodi del ciclo di vita
<a name="s3-tm-migration-lifecycle-methods"></a>


| Metodo V1 | Metodo V2 | Stato migrazione | 
| --- | --- | --- | 
| shutdownNow() | close() | Supportata | 
| shutdownNow(boolean) | Regola manualmente il codice usando il metodo close() | Non supportato | 

### Metodi client V1 non supportati
<a name="s3-tm-migration-unsupported-methods"></a>


| 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](#tm-unsupported-client-methods-copy) | 
| downloadmetodi con un S3ProgressListener parametro | Utilizzare [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html) | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-download) | 
|  `downloadDirectory`metodi con 4 o più parametri  |  | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-download-dir) | 
| uploadmetodo con un ObjectMetadataProvider parametro | Imposta i metadati nella richiesta | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-upload) | 
| uploadDirectorymetodi con \$1Provider parametro | Imposta i tag nella richiesta | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-uploadDirectory) | 

#### `copy`metodi con un `TransferStateChangeListener` parametro
<a name="tm-unsupported-client-methods-copy"></a>
+ `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
<a name="tm-unsupported-client-methods-download"></a>
+ `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
<a name="tm-unsupported-client-methods-download-dir"></a>
+ `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
<a name="tm-unsupported-client-methods-upload"></a>
+ `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
<a name="tm-unsupported-client-methods-uploadDirectory"></a>
+ `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
<a name="s3-tm-migration-model-objects"></a>

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
<a name="s3-tm-migration-core-transfer-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Supportata | 
| TransferManagerBuilder | S3TransferManager.Builder | Supportato | 
| Transfer | Transfer | Supportata | 
| AbortableTransfer | Transfer | Supportata (nessuna classe separata) | 
| Copy | Copy | Supportata | 
| Download | FileDownload | Supportato | 
| Upload | Upload / FileUpload | Supportato | 
| MultipleFileDownload | DirectoryDownload | Supportato | 
| MultipleFileUpload | DirectoryUpload | Supportata | 

### Oggetti di persistenza
<a name="s3-tm-migration-persistence-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Supportata | 
| PersistableUpload | ResumableFileUpload | Supportato | 
| PersistableTransfer | ResumableTransfer | Supportata | 
| PauseResult<T> | Oggetto riutilizzabile direttamente | Non supportato | 

### Oggetti risultanti
<a name="s3-tm-migration-result-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Supportata | 
| UploadResult | CompletedUpload | Supportata | 

### Oggetti di configurazione
<a name="s3-tm-migration-configuration-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration(sul client Amazon S3) | Supportata | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Supportato | 
| KeyFilter | DownloadFilter | Supportata | 

### Oggetti non supportati
<a name="s3-tm-migration-unsupported-objects"></a>


| Classe V1 | Alternativa V2 | Stato migrazione | 
| --- | --- | --- | 
| PauseStatus | Non supportata | Non supportato | 
| UploadContext | Non supportata | Non supportato | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Non supportato | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Non supportato | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Non supportato | 
| PresignedUrlDownload | Non supportata | Non supportato | 

## TransferManagerBuilder migrazione della configurazione
<a name="s3-tm-migration-builder-configuration"></a>

### Modifiche di configurazione
<a name="migration-transfer-manager-config-changes"></a>

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](examples-s3.md#s3-clients)

------
#### [ Use the AWS CRT-based S3 client ]


****  

| Impostazione | v1 | v2 - Transfer Manager che utilizza un client S3 basato su AWS CRT | 
| --- | --- | --- | 
|    (procurati un costruttore)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    client S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Esecutore  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Chiudi i pool di thread  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager | 
|    Dimensione minima della parte da caricare  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di caricamento in più parti  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Dimensione minima della parte di copia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di copia multiparte  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Disattiva i download paralleli  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcola sempre md5 multipart  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | 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)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    client S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Esecutore  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Chiudi i pool di thread  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager | 
|    Dimensione minima della parte da caricare  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di caricamento in più parti  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Dimensione minima della parte di copia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di copia multiparte  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Disattiva i download paralleli  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcola sempre md5 multipart  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Non supportato. | 

------

## Modifiche del comportamento
<a name="s3-tm-migration-behavior-changes"></a>

### Operazioni asincrone
<a name="s3-tm-migration-async-operations"></a>

**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
<a name="s3-tm-migration-error-handling"></a>

**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
<a name="migration-transfer-manager-behavior-fetches"></a>

Quando la funzionalità di trasferimento parallelo automatico è abilitata nell'SDK v2, S3 Transfer Manager utilizza [recuperi a intervalli di byte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) 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.