Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Diferencias en la operación de streaming entre 1.x y 2.x del AWS SDK para Java
Las operaciones de streaming, como Amazon S3 getObject y sus putObject métodos, admiten el no bloqueo I/O en la versión 2.x del SDK. Como resultado, los objetos del modelo de solicitud y respuesta ya no toman un InputStream como parámetro. En su lugar, para solicitudes sincrónicas, el objeto de solicitud acepta RequestBody, que es un flujo de bytes. El equivalente asincrónico acepta un AsyncRequestBody.
ejemplo de la operación PutObject de Amazon S3 en 1.x
s3client.putObject(BUCKET, KEY, new File(file_path));
ejemplo de la operación PutObject de Amazon S3 en 2.x
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));
Un objeto de respuesta de streaming acepta un ResponseTransformer para clientes sincrónicos y un AsyncResponseTransformer para asincrónicos en V2.
ejemplo de la operación GetObject de Amazon S3 en 1.x
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
ejemplo de la operación GetObject de Amazon S3 en 2.x
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));
En el SDK para Java 2.x, las operaciones de respuesta de streaming tienen un método AsBytes para cargar la respuesta en la memoria y simplificar las conversiones de tipo común en la memoria.
Migre el manejo concatenado de respuestas de GZIP
Al migrar desde el SDK for Java 1.x, actualice manualmente el código que incluye un flujo de respuesta de S3. GZIPInputStream Realiza este cambio si la respuesta puede contener varios miembros de GZIP concatenados. Selecciona ResponseTransformer.toGzipCompatibleInputStream() o, para un cliente asíncrono,. AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()
Tenga en cuenta lo siguiente al migrar este código:
-
La herramienta de migración no selecciona estos transformadores automáticamente.
-
En algunas versiones de JDK,
GZIPInputStreampuedes detenerte después de que un miembro de una respuesta de GZIP concatenada responda. Esto puede suceder si el siguiente fragmento de red no ha llegado. El resultado pueden ser datos truncados y descomprimidos sin excepción. -
Estos transformadores no descomprimen el contenido de la respuesta. Úsalos solo cuando envuelvas la transmisión devuelta.
GZIPInputStreamDe lo contrario, utiliceResponseTransformer.toInputStream()oAsyncResponseTransformer.toBlockingInputStream().
Para un cliente síncrono:
ResponseInputStream<GetObjectResponse> response = s3Client.getObject( request, ResponseTransformer.toGzipCompatibleInputStream()); try (GZIPInputStream gzipInputStream = new GZIPInputStream(response)) { // Read the decompressed response. }
Se puede utilizar ResponseTransformer.toGzipCompatibleInputStream(Duration) para configurar el tiempo de espera de la primera operación de lectura.
Para un cliente asíncrono:
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. }