Estoy tratando de cargar un archivo en S3, pero JVM dice que tengo un método de bloqueo de subprocesos llamados en fragmentos de código donde los subprocesos no deben bloquearse al llamar a file.readAllBytes(), entonces, ¿hay alguna manera de hacerlo? hacer el método asíncrono con Flux o Mono? o alguna otra forma de solucionar ese problema?
private Mono<Boolean> uploadFile(InputStream file, String bucket, String name) { try { return uploadAdapter.uploadObject(bucket,name,file.readAllBytes()); } catch (IOException e) { return Mono.just(false); } } @Override public Mono<Boolean> uploadObject(String bucketName, String objectKey, byte[] fileContent) { return Mono.fromFuture( s3AsyncClient.putObject(configurePutObject(bucketName, objectKey), AsyncRequestBody.fromBytes(fileContent))) .map(response -> response.sdkHttpResponse().isSuccessful()); }Dado que InputStream es una API síncrona, tiene 2 opciones, y eso es cierto para cualquier otra API síncrona:
java.nio2 , o funciones de la biblioteca Reactor-Netty, que tiene excelentes soluciones para este caso de uso .single() boundedElastic() . La diferencia es boundedElastic() limita la cantidad de subprocesos que puede abrir, por lo que terminará usando sus subprocesos como colas de bloqueo, lo cual es más seguro que single() .