

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Migre o Transfer Manager da versão 1 para a versão 2 do AWS SDK para Java
<a name="migration-s3-transfer-manager"></a>

Esse guia de migração aborda as principais diferenças entre o Gerenciador de Transferências v1 e o Gerenciador de Transferências v2 do S3, incluindo alterações no construtor, mapeamentos de métodos e exemplos de código para operações comuns. Depois de analisar essas diferenças, você pode migrar com êxito o código existente do Gerenciador de Transferências para aproveitar o desempenho aprimorado e as operações assíncronas na v2.

**Sobre a ferramenta de migração do AWS SDK**  
O AWS SDK para Java fornece uma [ferramenta de migração](migration-tool.md) automatizada que pode migrar grande parte da API do Transfer Manager v1 para a v2. No entanto, a ferramenta de migração não é compatível com vários recursos do Gerenciador de Transferências v1. Nesses casos, é preciso migrar manualmente o código do Gerenciador de Transferências de acordo com as orientações deste tópico.  
Ao longo deste guia, o **status da migração** mostra se a ferramenta de migração pode migrar automaticamente um construtor, método ou recurso:  
**Compatível**: a ferramenta de migração pode transformar automaticamente esse código
**Incompatível**: é preciso migrar o código manualmente
Mesmo para itens marcados com o status “Compatível”, analise os resultados da migração e faça um teste completo. A migração do Gerenciador de Transferências envolve mudanças de arquitetura significativas de operações síncronas para assíncronas.

## Visão geral do
<a name="s3-tm-migration-overview"></a>

O Gerenciador de Transferências do S3 v2 introduz mudanças significativas na API do Gerenciador de Transferências. O S3 Transfer Manager v2 é baseado em operações assíncronas e oferece melhor desempenho, especialmente quando você usa o cliente Amazon S3 baseado em CRT. AWS 

### Principais diferenças
<a name="s3-tm-migration-key-differences"></a>
+ **Pacote**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Nome da classe**: `TransferManager` → `S3TransferManager`
+ **Dependência do cliente**: cliente síncrono do Amazon S3 → cliente assíncrono do Amazon S3 (`S3AsyncClient`)
+ **Arquitetura**: operações síncronas → operações assíncronas com `CompletableFuture`
+ **Desempenho**: aprimorado com suporte ao cliente AWS baseado em CRT

## Alterações de alto nível
<a name="s3-tm-migration-high-level-changes"></a>


| Aspecto | V1 | V2 | 
| --- | --- | --- | 
| Dependência do Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Pacote | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Classe principal | TransferManager | S3TransferManager | 
| Cliente do Amazon S3 | AmazonS3 (síncrono) | S3AsyncClient (assíncrono) | 
| Tipos de retorno | Operações de bloqueio | CompletableFuture<T> | 

## Dependências do 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 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migração do construtor do cliente
<a name="s3-tm-migration-client-constructor"></a>

### Construtores compatíveis (migração automática)
<a name="s3-tm-migration-supported-constructors"></a>


| Construtor V1 | V2 equivalente | Status da migração | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Compatível | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Compatível | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Compatível | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Compatível | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Compatível | 

### Construtores incompatíveis (migração manual obrigatória)
<a name="s3-tm-migration-unsupported-constructors"></a>


| Construtor V1 | V2 equivalente | Notas de migração | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Migração manual obrigatória | Criar um S3AsyncClient separadamente | 
| new TransferManager(AmazonS3, ExecutorService) | Migração manual obrigatória | Criar um S3AsyncClient e configurar um executor | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Migração manual obrigatória | Parâmetro shutDownThreadPools incompatível | 

### Exemplos de migração manual
<a name="s3-tm-migration-manual-examples"></a>

**Código da V1:**

```
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
TransferManager transferManager = new TransferManager(s3Client);
```

**Código da 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();
```

## Migração do método do cliente
<a name="s3-tm-migration-client-methods"></a>

Atualmente, a ferramenta de migração é compatível com os métodos básicos `copy`, `download`, `upload`, `uploadDirectory`, `downloadDirectory`, `resumeDownload` e `resumeUpload`.

### Métodos de transferência principais
<a name="s3-tm-migration-core-transfer-methods"></a>


| Método da V1 | Método da V2 | Alteração do tipo de retorno | Status da migração | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Compatível | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Compatível | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Compatível | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Compatível | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Compatível | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Compatível | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Compatível | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Compatível | 

### Métodos de transferência com retomada
<a name="s3-tm-migration-resumable-methods"></a>


| Método da V1 | Método da V2 | Status da migração | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Compatível | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Compatível | 

### Métodos do ciclo de vida
<a name="s3-tm-migration-lifecycle-methods"></a>


| Método da V1 | Método da V2 | Status da migração | 
| --- | --- | --- | 
| shutdownNow() | close() | Compatível | 
| shutdownNow(boolean) | Ajustar manualmente o código usando o método close() | Não suportado | 

### Métodos de cliente V1 incompatíveis
<a name="s3-tm-migration-unsupported-methods"></a>


| Método da V1 | V2 alternativa | Observações | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Use o cliente de nível baixo do Amazon S3 | Não suportado | 
| getAmazonS3Client() | Salvar uma referência separadamente | Incompatível; não há getter na v2 | 
| getConfiguration() | Salvar uma referência separadamente | Incompatível; não há getter na v2 | 
| uploadFileList(...) | Fazer várias chamadas uploadFile() | Não suportado | 
| Métodos copy com um parâmetro TransferStateChangeListener | Usar o TransferListener | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-copy) | 
| Métodos download com um parâmetro S3ProgressListener | Usar o [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) | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-download) | 
| Métodos `downloadDirectory` com quatro ou mais parâmetros |  | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-download-dir) | 
| Método upload com um parâmetro ObjectMetadataProvider | Definir metadados na solicitação | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-upload) | 
| Métodos uploadDirectory com um parâmetro \*Provider | Definir tags na solicitação | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-uploadDirectory) | 

#### Métodos `copy` com um parâmetro `TransferStateChangeListener`
<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);
```

#### Métodos `download` com um parâmetro `S3ProgressListener`
<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.
```

#### Métodos `downloadDirectory` com quatro ou mais parâmetros
<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);
```

#### Método `upload` com um parâmetro `ObjectMetadata`
<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` com parâmetro `ObjectMetadataProvider`
<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);
```

## Migração de objetos de modelo
<a name="s3-tm-migration-model-objects"></a>

Em AWS SDK for Java 2.x, muitos dos objetos do `TransferManager` modelo foram redesenhados e vários métodos getter e setter disponíveis nos objetos do modelo da v1 não são mais suportados. 

Na v2, você pode usar a classe `CompletableFuture<T>` para realizar ações quando a transferência for concluída, seja com êxito ou com uma exceção. Você pode usar o método `join()` para aguardar a conclusão, se necessário. 

### Objetos de transferência principal
<a name="s3-tm-migration-core-transfer-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Compatível | 
| TransferManagerBuilder | S3TransferManager.Builder | Compatível | 
| Transfer | Transfer | Compatível | 
| AbortableTransfer | Transfer | Compatível (sem classe separada) | 
| Copy | Copy | Compatível | 
| Download | FileDownload | Compatível | 
| Upload | Upload / FileUpload | Compatível | 
| MultipleFileDownload | DirectoryDownload | Compatível | 
| MultipleFileUpload | DirectoryUpload | Compatível | 

### Objetos de persistência
<a name="s3-tm-migration-persistence-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Compatível | 
| PersistableUpload | ResumableFileUpload | Compatível | 
| PersistableTransfer | ResumableTransfer | Compatível | 
| PauseResult<T> | Objeto com retomada direta | Não suportado | 

### Objetos de resultado
<a name="s3-tm-migration-result-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Compatível | 
| UploadResult | CompletedUpload | Compatível | 

### Objetos de configuração
<a name="s3-tm-migration-configuration-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration (no cliente do Amazon S3) | Compatível | 
| TransferProgress | TransferProgress \+ TransferProgressSnapshot | Compatível | 
| KeyFilter | DownloadFilter | Compatível | 

### Objetos não compatíveis
<a name="s3-tm-migration-unsupported-objects"></a>


| Classe V1 | V2 alternativa | Status da migração | 
| --- | --- | --- | 
| PauseStatus | Sem compatibilidade | Não suportado | 
| UploadContext | Sem compatibilidade | Não suportado | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Não suportado | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Não suportado | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Não suportado | 
| PresignedUrlDownload | Sem compatibilidade | Não suportado | 

## TransferManagerBuilder migração de configuração
<a name="s3-tm-migration-builder-configuration"></a>

### Alterações de configuração
<a name="migration-transfer-manager-config-changes"></a>

As alterações de configuração que você precisa definir para o Gerenciador de Transferências v2 dependem do cliente do S3 utilizado. Você pode escolher entre o cliente S3 AWS baseado em CRT ou o cliente assíncrono S3 padrão baseado em Java. Consulte informações sobre as diferenças no tópico [Clientes S3 no AWS SDK for Java 2.x](examples-s3.md#s3-clients).

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


****  

| Configuração | v1 | v2 - Gerenciador de transferências usando o cliente S3 baseado em AWS CRT | 
| --- | --- | --- | 
|  <br />(obtenha um construtor) |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|  <br />Cliente do S3 |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|  <br />Executor |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|  <br />Encerrar grupos de threads |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Sem suporte. O executor fornecido não será desligado quando o S3TransferManager for fechado | 
|  <br />Tamanho mínimo da parte de upload |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|  <br />Limite de multipart upload |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|  <br />Tamanho mínimo da parte de cópia |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|  <br />Limite de cópia de multipart |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|  <br />Desabilitar downloads paralelos |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Desabilite os downloads paralelos passando um cliente do S3 padrão baseado em Java com multipart desativado (padrão) para o Gerenciador de Transferências.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|  <br />Sempre calcule o multipart md5 |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Sem compatibilidade. | 

------
#### [ Use Java-based S3 async client ]


****  

| Configuração | v1 | v2: Gerenciador de Transferências que usa o cliente assíncrono do S3 baseado em Java | 
| --- | --- | --- | 
|  <br />(obtenha um construtor) |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|  <br />Cliente do S3 |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|  <br />Executor |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|  <br />Encerrar grupos de threads |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Sem suporte. O executor fornecido não será desligado quando o S3TransferManager for fechado | 
|  <br />Tamanho mínimo da parte de upload |  <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>  | 
|  <br />Limite de multipart upload |  <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>  | 
|  <br />Tamanho mínimo da parte de cópia |  <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>  | 
|  <br />Limite de cópia de multipart |  <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>  | 
|  <br />Desabilitar downloads paralelos |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Desabilite os downloads paralelos passando um cliente do S3 padrão baseado em Java com multipart desativado (padrão) para o Gerenciador de Transferências.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|  <br />Sempre calcule o multipart md5 |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Sem compatibilidade. | 

------

## Alteração de comportamento
<a name="s3-tm-migration-behavior-changes"></a>

### Operações assíncronas
<a name="s3-tm-migration-async-operations"></a>

**V1 (bloqueio):**

```
Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file);
upload.waitForCompletion(); // Blocks until complete
```

**V2 (assíncrono):**

```
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());
});
```

### Tratamento de erros
<a name="s3-tm-migration-error-handling"></a>

**V1:** as transferências de diretórios falham completamente se alguma subsolicitação falha.

**V2:** as transferências de diretórios são concluídas com êxito mesmo se algumas subsolicitações falham. Verifique se há erros de forma explícita:

```
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 paralelo por meio de buscas de intervalo de bytes
<a name="migration-transfer-manager-behavior-fetches"></a>

Quando o recurso de transferência paralela automática está ativado no SDK v2, o Gerenciador de Transferências do S3 usa [buscas de intervalo de bytes](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) para recuperar partes específicas do objeto em paralelo (download multipart). A forma como um objeto é baixado com a v2 não depende de como o objeto foi originalmente carregado. Todos os downloads podem se beneficiar da alta taxa de transferência e da simultaneidade. 

Por outro lado, com o Gerenciador de Transferências v1, faz diferença como o objeto foi originalmente carregado. O Gerenciador de Transferências v1 recupera as partes do objeto da mesma forma que as partes foram carregadas. Se um objeto foi originalmente carregado como um único objeto, o Gerenciador de transferência v1 não é capaz de acelerar o processo de download usando subsolicitações.