es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿El método share().block() de Mono es no bloqueante?

Estoy en medio de aprender Spring WebFlux. Estoy utilizando una llamada REST utilizando el código siguiente para analizar la respuesta:

private void parseJsonResponse(String folderId) throws IOException {
    Mono<objectnode> theresponseMono = webClient.get()
            .uri("/some/uri")
            .retrieve().bodyToMono(ObjectNode.class);
    ObjectNode node = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            .readValue(theresponseMono.share().block().toString(), ObjectNode.class);
   //manejar el objeto node aquí.....
}

Pregunta: ¿Es theresponseMono.share().block() bloqueante aquí? Si no lo es, ¿qué se puede hacer para que sea completamente no bloqueante? Estoy buscando la documentación relevante sobre esto, ya que quiero aprenderlo y no solo busco un “sí” o “no”. En resumen, necesito recuperar theresponseMono de manera no bloqueante. ¿Algún consejo o documentación oficial/enlace al respecto por favor? Gracias.

EDIción:
Esto es lo que estoy intentando lograr:

Mono<objectnode> theresponseMono = webClient.get()
                .uri("/some/uri")
                .retrieve().bodyToMono(ObjectNode.class).flatMap(node -> {
                    if (node.get("list").get("entries").isArray()) {

                        for (JsonNode jsonNode : node.get("list").get("entries")) {
                            System.out.println(jsonNode);
                        }

                    }
                });

De alguna manera no puedo mapear usando flatMap. ¿Qué falta aquí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    No, theresponseMono.share().block() no es sin bloqueo. Llamar a .share().block() en un Mono se suscribe a la fuente y bloquea el hilo de llamada hasta que haya un resultado disponible. Para hacerlo completamente sin bloqueo, puedes usar operadores reactivos como flatMap o map. Puedes reemplazar la llamada a share().block() con un operador flatMap que opera en el ObjectNode emitido por el Mono y realiza las operaciones necesarias sin bloquear el hilo de llamada. Aquí tienes un ejemplo:

    webClient.get()
        .uri("/some/uri")
        .retrieve()
        .bodyToMono(ObjectNode.class)
        .flatMap(node -> {
            // Maneja el objeto node aquí sin bloqueo
            return Mono.empty();
        })
        .subscribe(); // Suscríbete para iniciar la tubería
    

    En el ejemplo anterior, el operador flatMap te permite aplicar una función al ObjectNode emitido y devolver un nuevo tipo reactivo. Aquí simplemente estamos devolviendo un Mono vacío ya que no necesitamos emitir nada. De esta manera, puedes realizar cualquier operación necesaria en el objeto emitido sin bloquear el hilo de llamada.

    En cuanto a la segunda parte de la pregunta, puede ser que el motivo por el que flatMap no está funcionando como se espera sea porque no devuelve un tipo reactivo. El operador flatMap siempre debe devolver un tipo reactivo, de lo contrario, no formará parte de la tubería. Aquí tienes una versión actualizada que debería funcionar:

    webClient.get()
        .uri("/some/uri")
        .retrieve()
        .bodyToMono(ObjectNode.class)
        .flatMap(node -> {
            if (node.get("list").get("entries").isArray()) {
                for (JsonNode jsonNode : node.get("list").get("entries")) {
                    System.out.println(jsonNode);
                }
            }
            return Mono.empty();
        })
        .subscribe(); // Suscríbete para iniciar la tubería
    

    En esta versión, estamos devolviendo un Mono vacío como último paso en el operador flatMap, que es un tipo reactivo válido. De esta manera, el operador flatMap se convierte en parte de la tubería reactiva y ya no se salta.

Comments are closed.