

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Migrieren Sie den Transfer Manager von Version 1 auf Version 2 von AWS SDK für Java
<a name="migration-s3-transfer-manager"></a>

Dieser Migrationsleitfaden behandelt die wichtigsten Unterschiede zwischen Transfer Manager v1 und S3 Transfer Manager v2, einschließlich Konstruktoränderungen, Methodenzuordnungen und Codebeispiele für allgemeine Operationen. Nachdem Sie diese Unterschiede überprüft haben, können Sie Ihren vorhandenen Transfer Manager-Code erfolgreich migrieren, um von der verbesserten Leistung und den asynchronen Vorgängen in Version 2 zu profitieren.

**Über das AWS SDK-Migrationstool**  
Das AWS SDK für Java bietet ein automatisiertes [Migrationstool](migration-tool.md), mit dem ein Großteil der v1 Transfer Manager-API auf Version 2 migriert werden kann. Das Migrationstool unterstützt jedoch nicht mehrere v1-Transfer-Manager-Funktionen. In diesen Fällen müssen Sie den Transfer Manager-Code anhand der Anleitung in diesem Thema manuell migrieren.  
In diesem Handbuch wird im **Migrationsstatus angegeben**, ob das Migrationstool einen Konstruktor, eine Methode oder ein Feature automatisch migrieren kann:  
**Unterstützt**: Das Migrationstool kann diesen Code automatisch transformieren
**Nicht unterstützt**: Sie müssen den Code manuell migrieren
Überprüfen Sie auch bei Elementen, die als „Unterstützt“ gekennzeichnet sind, die Migrationsergebnisse und testen Sie sie gründlich. Die Transfer Manager-Migration beinhaltet erhebliche architektonische Änderungen von synchronen zu asynchronen Vorgängen.

## -Übersicht
<a name="s3-tm-migration-overview"></a>

S3 Transfer Manager v2 führt wichtige Änderungen an der Transfer Manager-API ein. S3 Transfer Manager v2 basiert auf asynchronen Vorgängen und bietet eine bessere Leistung, insbesondere wenn Sie den AWS CRT-basierten Amazon S3 S3-Client verwenden.

### Die wichtigsten Unterschiede:
<a name="s3-tm-migration-key-differences"></a>
+ **Package**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Klassenname**: `TransferManager` → `S3TransferManager`
+ **Kundenabhängigkeit**: Synchroner Amazon S3 S3-Client → Asynchroner Amazon S3 S3-Client () `S3AsyncClient`
+ **Architektur**: Synchrone Operationen → Asynchrone Operationen mit `CompletableFuture`
+ **Leistung**: Verbessert durch AWS CRT-basierte Client-Unterstützung

## Änderungen auf hoher Ebene
<a name="s3-tm-migration-high-level-changes"></a>


| Aspekt | V1 | V2 | 
| --- | --- | --- | 
| Abhängigkeit von Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Package | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Hauptklasse | TransferManager | S3TransferManager | 
| Amazon S3 S3-Klient | AmazonS3(synchronisieren) | S3AsyncClient(asynchron) | 
| Rückgabetypen | Operationen blockieren | CompletableFuture<T> | 

## Maven-Abhängigkeiten
<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 [Letzte Version](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migration des Client-Konstruktors
<a name="s3-tm-migration-client-constructor"></a>

### Unterstützte Konstruktoren (automatische Migration)
<a name="s3-tm-migration-supported-constructors"></a>


| V1-Konstruktor | V2-Äquivalent | Migrationsstatus | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Unterstützt | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Unterstützt | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Unterstützt | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Unterstützt | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Unterstützt | 

### Konstruktoren werden nicht unterstützt (manuelle Migration erforderlich)
<a name="s3-tm-migration-unsupported-constructors"></a>


| V1-Konstruktor | V2-Äquivalent | Hinweise zur Migration | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Manuelle Migration erforderlich | Erstellen Sie ein S3AsyncClient separates | 
| new TransferManager(AmazonS3, ExecutorService) | Manuelle Migration erforderlich | Erstellen Sie einen S3AsyncClient Executor und konfigurieren Sie ihn | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Manuelle Migration erforderlich | shutDownThreadPoolsParameter wird nicht unterstützt | 

### Beispiele für manuelle Migrationen
<a name="s3-tm-migration-manual-examples"></a>

**V1-Code:**

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

**V2-Kode:**

```
// Create an `S3AsyncClient` with similar configuration
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build();

// Provide the configured `S3AsyncClient` to the S3 transfer manager builder.
S3TransferManager transferManager = S3TransferManager.builder()
    .s3Client(s3AsyncClient)
    .build();
```

## Migration der Client-Methode
<a name="s3-tm-migration-client-methods"></a>

Derzeit unterstützt das Migrationstool grundlegende `copy``download`,`upload`,`uploadDirectory`,`downloadDirectory`,`resumeDownload`, und `resumeUpload` Methoden.

### Wichtigste Übertragungsmethoden
<a name="s3-tm-migration-core-transfer-methods"></a>


| V1-Methode | V2-Methode | Änderung des Rückgabetyps | Migrationsstatus | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Unterstützt | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Unterstützt | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Unterstützt | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Unterstützt | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Unterstützt | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Unterstützt | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Unterstützt | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Unterstützt | 

### Wiederaufnehmbare Übertragungsmethoden
<a name="s3-tm-migration-resumable-methods"></a>


| V1-Methode | V2-Methode | Migrationsstatus | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Unterstützt | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Unterstützt | 

### Lebenszyklus-Methoden
<a name="s3-tm-migration-lifecycle-methods"></a>


| V1-Methode | V2-Methode | Migrationsstatus | 
| --- | --- | --- | 
| shutdownNow() | close() | Unterstützt | 
| shutdownNow(boolean) | Passen Sie den Code mithilfe der close() Methode manuell an | Nicht unterstützt | 

### Nicht unterstützte V1-Client-Methoden
<a name="s3-tm-migration-unsupported-methods"></a>


| V1-Methode | V2-Alternative | Hinweise | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Verwenden Sie den Amazon S3 S3-Client auf niedriger Ebene | Nicht unterstützt | 
| getAmazonS3Client() | Speichern Sie eine Referenz separat | Nicht unterstützt; kein Getter in Version 2 | 
| getConfiguration() | Speichern Sie eine Referenz separat | Nicht unterstützt; kein Getter in Version 2 | 
| uploadFileList(...) | Tätigen Sie mehrere Anrufe uploadFile() | Nicht unterstützt | 
| copyMethoden mit einem TransferStateChangeListener Parameter | Verwenden von TransferListener | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-copy) | 
| downloadMethoden mit einem S3ProgressListener Parameter | Verwenden von [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) | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-download) | 
|  `downloadDirectory`Methoden mit 4 oder mehr Parametern  |  | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-download-dir) | 
| uploadMethode mit einem ObjectMetadataProvider Parameter | Legen Sie Metadaten in der Anfrage fest | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-upload) | 
| uploadDirectoryMethoden mit \$1Provider Parametern | Legen Sie Tags auf Anfrage fest | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-uploadDirectory) | 

#### `copy`Methoden mit einem `TransferStateChangeListener` Parameter
<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`Methoden mit einem `S3ProgressListener` Parameter
<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`Methoden mit 4 oder mehr Parametern
<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`Methode mit `ObjectMetadata` Parameter
<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`mit `ObjectMetadataProvider` Parameter
<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);
```

## Migration von Modellobjekten
<a name="s3-tm-migration-model-objects"></a>

In AWS SDK for Java 2.x wurden viele `TransferManager` Modellobjekte neu gestaltet, und mehrere Getter- und Setter-Methoden, die in den Modellobjekten von Version 1 verfügbar sind, werden nicht mehr unterstützt. 

In Version 2 können Sie die `CompletableFuture<T>` Klasse verwenden, um Aktionen auszuführen, wenn die Übertragung abgeschlossen wurde — entweder erfolgreich oder mit einer Ausnahme. Sie können die `join()` Methode verwenden, um bei Bedarf auf den Abschluss zu warten. 

### Kernübertragungsobjekte
<a name="s3-tm-migration-core-transfer-objects"></a>


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Unterstützt | 
| TransferManagerBuilder | S3TransferManager.Builder | Unterstützt | 
| Transfer | Transfer | Unterstützt | 
| AbortableTransfer | Transfer | Unterstützt (keine separate Klasse) | 
| Copy | Copy | Unterstützt | 
| Download | FileDownload | Unterstützt | 
| Upload | Upload / FileUpload | Unterstützt | 
| MultipleFileDownload | DirectoryDownload | Unterstützt | 
| MultipleFileUpload | DirectoryUpload | Unterstützt | 

### Persistenz-Objekte
<a name="s3-tm-migration-persistence-objects"></a>


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Unterstützt | 
| PersistableUpload | ResumableFileUpload | Unterstützt | 
| PersistableTransfer | ResumableTransfer | Unterstützt | 
| PauseResult<T> | Direkt wiederaufnehmbares Objekt | Nicht unterstützt | 

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


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Unterstützt | 
| UploadResult | CompletedUpload | Unterstützt | 

### Konfigurationsobjekte
<a name="s3-tm-migration-configuration-objects"></a>


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration(auf dem Amazon S3 S3-Client) | Unterstützt | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Unterstützt | 
| KeyFilter | DownloadFilter | Unterstützt | 

### Nicht unterstützte Objekte
<a name="s3-tm-migration-unsupported-objects"></a>


| Klasse V1 | Alternative V2 | Migrationsstatus | 
| --- | --- | --- | 
| PauseStatus | Nicht unterstützt | Nicht unterstützt | 
| UploadContext | Nicht unterstützt | Nicht unterstützt | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Nicht unterstützt | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Nicht unterstützt | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Nicht unterstützt | 
| PresignedUrlDownload | Nicht unterstützt | Nicht unterstützt | 

## TransferManagerBuilder Migration der Konfiguration
<a name="s3-tm-migration-builder-configuration"></a>

### Konfigurationsänderungen
<a name="migration-transfer-manager-config-changes"></a>

Die Konfigurationsänderungen, die Sie für den v2-Transfermanager vornehmen müssen, hängen davon ab, welchen S3-Client Sie verwenden. Sie haben die Wahl zwischen dem AWS CRT-basierten S3-Client oder dem standardmäßigen, auf Java basierenden asynchronen S3-Client. Informationen zu den Unterschieden finden Sie im Thema. [S3-Clients in der AWS SDK for Java 2.x](examples-s3.md#s3-clients)

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


****  

| Einstellung | v1 | v2 — Transfer Manager mit AWS CRT-basiertem S3-Client | 
| --- | --- | --- | 
|    (hol dir einen Builder)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3-Klient  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Testamentsvollstrecker  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Threadpools herunterfahren  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird | 
|    Minimale Größe des Upload-Teils  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Schwellenwert für mehrteiliges Hochladen  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Minimale Größe des Kopierteils  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Schwellenwert für mehrteiliges Kopieren  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    parallel Downloads deaktivieren  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Berechne immer mehrteiliges MD5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Nicht unterstützt | 

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


****  

| Einstellung | v1 | v2 — Transfer Manager mit einem Java-basierten asynchronen S3-Client | 
| --- | --- | --- | 
|    (hol dir einen Builder)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3-Klient  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Testamentsvollstrecker  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Threadpools herunterfahren  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird | 
|    Minimale Größe des Upload-Teils  |  <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>  | 
|    Schwellenwert für mehrteiliges Hochladen  |  <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>  | 
|    Minimale Größe des Kopierteils  |  <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>  | 
|    Schwellenwert für mehrteiliges Kopieren  |  <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>  | 
|    parallel Downloads deaktivieren  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Berechne immer mehrteiliges MD5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Nicht unterstützt | 

------

## Verhaltensänderungen
<a name="s3-tm-migration-behavior-changes"></a>

### Asynchrone Operationen
<a name="s3-tm-migration-async-operations"></a>

**V1 (blockierend):**

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

**V2 (asynchron):**

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

### Fehlerbehandlung
<a name="s3-tm-migration-error-handling"></a>

**V1:** Verzeichnisübertragungen schlagen vollständig fehl, wenn eine Unteranforderung fehlschlägt.

**V2:** Verzeichnisübertragungen werden erfolgreich abgeschlossen, auch wenn einige Unteranfragen fehlschlagen. Explizit nach Fehlern suchen:

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

### Paralleler Download über Bytebereichs-Abrufe
<a name="migration-transfer-manager-behavior-fetches"></a>

Wenn die automatische parallele Übertragung im v2-SDK aktiviert ist, verwendet der S3 Transfer Manager [Bytebereichs-Abrufe, um bestimmte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) Teile des Objekts parallel abzurufen (mehrteiliger Download). Die Art und Weise, wie ein Objekt mit Version 2 heruntergeladen wird, hängt nicht davon ab, wie das Objekt ursprünglich hochgeladen wurde. Alle Downloads können von hohem Durchsatz und Parallelität profitieren. 

Im Gegensatz dazu spielt es beim Transfer Manager von Version 1 eine Rolle, wie das Objekt ursprünglich hochgeladen wurde. Der v1-Transfermanager ruft die Teile des Objekts auf die gleiche Weise ab, wie die Teile hochgeladen wurden. Wenn ein Objekt ursprünglich als einzelnes Objekt hochgeladen wurde, ist der v1 Transfer Manager nicht in der Lage, den Download-Vorgang mithilfe von Unteranforderungen zu beschleunigen.