View a markdown version of this page

Diferenças de operação de streaming entre 1.x e 2.x do AWS SDK para Java - AWS SDK for Java 2.x

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

Diferenças de operação de streaming entre 1.x e 2.x do AWS SDK para Java

As operações de streaming, como Amazon S3 getObject e putObject métodos, oferecem suporte ao não bloqueio I/O na versão 2.x do SDK. Como resultado, os objetos de modelo de solicitação e resposta não usam mais InputStream como parâmetro. Em vez disso, para solicitações síncronas, o objeto de solicitação aceita RequestBody, que é um fluxo de bytes. O equivalente assíncrono aceita um AsyncRequestBody.

exemplo da operação PutObject do Amazon S3 em 1.x
s3client.putObject(BUCKET, KEY, new File(file_path));
exemplo da operação PutObject do Amazon S3 em 2.x
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));

Em paralelo, o objeto de resposta aceita ResponseTransformer para clientes síncronos e AsyncResponseTransformer para clientes assíncronos na V2.

exemplo da operação GetObject do Amazon S3 em 1.x
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
exemplo da operação GetObject do Amazon S3 em 2.x
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));

No SDK para Java 2.x, as operações de resposta de streaming têm um método AsBytes para carregar a resposta na memória e simplificar as conversões de tipos comuns na memória.

Migrar o tratamento de respostas GZIP concatenadas

Ao migrar do SDK for Java 1.x, atualize manualmente o código que envolve um fluxo de resposta do S3. GZIPInputStream Faça essa alteração se a resposta puder conter vários membros GZIP concatenados. Selecione ResponseTransformer.toGzipCompatibleInputStream() ou, para um cliente assíncrono,. AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()

Considere o seguinte ao migrar esse código:

  • A ferramenta de migração não seleciona esses transformadores automaticamente.

  • Em algumas versões do JDK, você GZIPInputStream pode parar depois de um membro de uma resposta GZIP concatenada. Isso pode acontecer se o próximo fragmento da rede não chegar. O resultado pode ser dados truncados e descompactados sem exceção.

  • Esses transformadores não descomprimem o conteúdo da resposta. Use-os somente ao incluir o stream retornadoGZIPInputStream. Caso contrário, use ResponseTransformer.toInputStream() ouAsyncResponseTransformer.toBlockingInputStream().

Para um cliente síncrono:

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

Você pode usar ResponseTransformer.toGzipCompatibleInputStream(Duration) para configurar o tempo limite para a primeira operação de leitura.

Para um cliente assí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. }