View a markdown version of this page

Unterschiede beim Streaming-Betrieb zwischen 1.x und 2.x des AWS SDK für Java - AWS SDK for Java 2.x

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.

Unterschiede beim Streaming-Betrieb zwischen 1.x und 2.x des AWS SDK für Java

Streaming-Operationen wie Amazon S3 getObject und putObject Methods unterstützen die Nichtblockierung I/O in Version 2.x des SDK. Infolgedessen verwenden die Objekte des Anforderungs- und Antwortmodells kein A mehr InputStream als Parameter. Stattdessen akzeptiert das Anforderungsobjekt bei synchronen AnfragenRequestBody, was ein Bytestrom ist. Das asynchrone Äquivalent akzeptiert eine. AsyncRequestBody

Beispiel des Amazon S3 S3-PutObject-Betriebs in 1.x
s3client.putObject(BUCKET, KEY, new File(file_path));
Beispiel des Amazon S3 S3-PutObject-Betriebs in 2.x
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));

Ein Streaming-Antwortobjekt akzeptiert a ResponseTransformer für synchrone Clients und a AsyncResponseTransformer für asynchrone Clients in V2.

Beispiel des Amazon S3 S3-GetObject-Betriebs in 1.x
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
Beispiel des Amazon S3 S3-GetObject-Betriebs in 2.x
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));

Im SDK for Java 2.x verfügen Streaming-Antwortoperationen über eine AsBytes Methode, um die Antwort in den Speicher zu laden und gängige Typkonvertierungen im Speicher zu vereinfachen.

Migrieren Sie die Verarbeitung verketteter GZIP-Antworten

Aktualisieren Sie bei der Migration von SDK for Java 1.x manuell den Code, der einen S3-Antwortstream einschließt. GZIPInputStream Nehmen Sie diese Änderung vor, wenn die Antwort mehrere verkettete GZIP-Mitglieder enthalten kann. Wählen Sie ResponseTransformer.toGzipCompatibleInputStream() oder, für einen asynchronen Client,. AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()

Beachten Sie bei der Migration dieses Codes Folgendes:

  • Das Migrationstool wählt diese Transformatoren nicht automatisch aus.

  • Bei einigen JDK-Versionen GZIPInputStream können Sie nach einem Mitglied einer verketteten GZIP-Antwort aufhören. Dies kann passieren, wenn der nächste Netzwerkblock nicht eingetroffen ist. Das Ergebnis können ausnahmslos gekürzte dekomprimierte Daten sein.

  • Diese Transformatoren dekomprimieren den Inhalt der Antwort nicht. Verwenden Sie sie nur, wenn Sie den zurückgegebenen Stream GZIPInputStream einschließen. Verwenden Sie andernfalls ResponseTransformer.toInputStream() oderAsyncResponseTransformer.toBlockingInputStream().

Für einen synchronen Client:

ResponseInputStream<GetObjectResponse> response = s3Client.getObject( request, ResponseTransformer.toGzipCompatibleInputStream()); try (GZIPInputStream gzipInputStream = new GZIPInputStream(response)) { // Read the decompressed response. }

Sie können ResponseTransformer.toGzipCompatibleInputStream(Duration) es verwenden, um das Timeout für den ersten Lesevorgang zu konfigurieren.

Für einen asynchronen Client:

CompletableFuture<ResponseInputStream<GetObjectResponse>> responseFuture = s3AsyncClient.getObject( request, AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()); try (ResponseInputStream<GetObjectResponse> response = responseFuture.join(); GZIPInputStream gzipInputStream = new GZIPInputStream(response)) { // Read the decompressed response. Reads block the calling thread. }