Configuración del cliente asincrónico S3 basado en Java para usar transferencias paralelas
Desde la versión 2.27.5, el cliente asincrónico estándar de S3 basado en Java admite transferencias paralelas automáticas (cargas y descargas multiparte). La compatibilidad con las transferencias paralelas se configura al crear el cliente asincrónico de S3 basado en Java.
En esta sección se muestra cómo habilitar las transferencias paralelas y cómo personalizar la configuración.
Cree una instancia de S3AsyncClient
Cuando se crea una instancia de S3AsyncClient sin llamar a ninguno de los métodos multipart* en el generador
Creación sin compatibilidad multiparte
import software.amazon.awssdk.auth.credentials.ProcessCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3AsyncClient; S3AsyncClient s3Client = S3AsyncClient.create(); S3AsyncClient s3Client2 = S3AsyncClient.builder().build(); S3AsyncClient s3Client3 = S3AsyncClient.builder() .credentialsProvider(ProcessCredentialsProvider.builder().build()) .region(Region.EU_NORTH_1) .build();
Creación con compatibilidad multiparte
Para habilitar transferencias paralelas con configuración predeterminada, llame al multipartEnabled en el generador y pase true como se muestra en el siguiente ejemplo.
S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder() .multipartEnabled(true) .build();
El valor predeterminado es 8 MiB para la configuración de thresholdInBytes y minimumPartSizeInBytes.
Si personaliza la configuración multiparte, las transferencias paralelas se habilitan automáticamente, como se muestra a continuación.
import software.amazon.awssdk.services.s3.S3AsyncClient; import static software.amazon.awssdk.transfer.s3.SizeConstant.MB; S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder() .multipartConfiguration(b -> b .thresholdInBytes(16 * MB) .minimumPartSizeInBytes(10 * MB)) .build();
Carga de flujos de tamaño desconocido
El cliente asincrónico de S3 basado en Java con multiparte habilitada puede controlar eficientemente flujos de entrada cuando el tamaño total no se conozca de antemano:
public PutObjectResponse asyncClient_multipart_stream_unknown_size(String bucketName, String key, InputStream inputStream) { S3AsyncClient s3AsyncClient = S3AsyncClient.builder().multipartEnabled(true).build(); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the // content length is unknown. CompletableFuture<PutObjectResponse> responseFuture = s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body) .exceptionally(e -> { if (e != null) { logger.error(e.getMessage(), e); } return null; }); PutObjectResponse response = responseFuture.join(); // Wait for the response. executor.shutdown(); return response; }
Este método evita los problemas que pueden surgir al especificar manualmente una longitud de contenido incorrecta, como objetos truncados o cargas fallidas.