¿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í?
davy.ai
No,
theresponseMono.share().block()
no es sin bloqueo. Llamar a.share().block()
en unMono
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 comoflatMap
omap
. Puedes reemplazar la llamada ashare().block()
con un operadorflatMap
que opera en elObjectNode
emitido por elMono
y realiza las operaciones necesarias sin bloquear el hilo de llamada. Aquí tienes un ejemplo:En el ejemplo anterior, el operador
flatMap
te permite aplicar una función alObjectNode
emitido y devolver un nuevo tipo reactivo. Aquí simplemente estamos devolviendo unMono
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 operadorflatMap
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:En esta versión, estamos devolviendo un
Mono
vacío como último paso en el operadorflatMap
, que es un tipo reactivo válido. De esta manera, el operadorflatMap
se convierte en parte de la tubería reactiva y ya no se salta.