View a markdown version of this page

Différences entre les opérations de streaming entre les versions 1.x et 2.x du AWS SDK pour Java - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Différences entre les opérations de streaming entre les versions 1.x et 2.x du AWS SDK pour Java

Les opérations de streaming, telles qu'Amazon S3 getObject et ses putObject méthodes, prennent en charge le non-blocage I/O dans la version 2.x du SDK. Par conséquent, les objets du modèle de demande et de réponse ne prennent plus un InputStream comme paramètre. Au lieu de cela, pour les demandes synchrones, l'objet de demande accepteRequestBody, qui est un flux d'octets. L'équivalent asynchrone accepte un. AsyncRequestBody

Exemple de l'opération PutObject d'Amazon S3 dans la version 1.x
s3client.putObject(BUCKET, KEY, new File(file_path));
Exemple de l'opération PutObject d'Amazon S3 dans la version 2.x
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));

Un objet de réponse de streaming accepte un ResponseTransformer pour les clients synchrones et un AsyncResponseTransformer pour les clients asynchrones dans la V2.

Exemple de l'opération GetObject d'Amazon S3 dans la version 1.x
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
Exemple de l'opération GetObject d'Amazon S3 dans la version 2.x
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));

Dans le SDK pour Java 2.x, les opérations de réponse en continu disposent AsBytes d'une méthode permettant de charger la réponse en mémoire et de simplifier les conversions de type courantes en mémoire.

Migrer la gestion des réponses GZIP concaténées

Lors de la migration depuis le SDK for Java 1.x, mettez à jour manuellement le code qui intègre un flux de réponse S3. GZIPInputStream Effectuez cette modification si la réponse peut contenir plusieurs membres GZIP concaténés. Sélectionnez ResponseTransformer.toGzipCompatibleInputStream() ou, pour un client asynchrone,. AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()

Tenez compte des points suivants lorsque vous migrez ce code :

  • L'outil de migration ne sélectionne pas automatiquement ces transformateurs.

  • Sur certaines versions du JDK, vous GZIPInputStream pouvez vous arrêter après un membre d'une réponse GZIP concaténée. Cela peut se produire si le prochain segment de réseau n'est pas arrivé. Le résultat peut être des données décompressées tronquées sans exception.

  • Ces transformateurs ne décompressent pas le contenu de la réponse. Utilisez-les uniquement lorsque vous encapsulez le flux renvoyéGZIPInputStream. Sinon, utilisez ResponseTransformer.toInputStream() ouAsyncResponseTransformer.toBlockingInputStream().

Pour un client synchrone :

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

Vous pouvez l'utiliser ResponseTransformer.toGzipCompatibleInputStream(Duration) pour configurer le délai d'expiration de la première opération de lecture.

Pour un client asynchrone :

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