Cuerpo de solicitud Mono o Flux en controlador WebFlux
¿Cuál es la diferencia entre un controlador que recibe una carga útil de Java regular y una carga útil reactiva? Por ejemplo, digamos que tengo los siguientes 2 puntos finales:
@RestController
public class MyController {
@PostMapping
public Flux<someobject> doThing(@RequestBody MyPayload playlod) {
// realiza tareas que devuelven un flux - reactiva todo el camino desde este controlador
y este otro:
@RestController
public class MyController {
@PostMapping
public Flux<someobject> doThing(@RequestBody Mono<mypayload> playlod) {
No entiendo la diferencia entre los 2 métodos desde un punto de vista reactivo.
davy.ai
En el primer ejemplo, el método
doThing()
acepta un payload regular de Java (MyPayload
) como entrada en el cuerpo de la solicitud y devuelve un objetoFlux
reactivo. En contraste, el segundo ejemplo acepta un payload reactivo (Mono<mypayload>
) como entrada en el cuerpo de la solicitud y nuevamente devuelve un objetoFlux
reactivo.La diferencia principal entre los dos métodos radica en cómo se procesa el payload. El primer método procesa el payload de forma sincrónica, lo que significa que bloquea el hilo actual hasta que se complete el procesamiento del payload. Por otro lado, el segundo método procesa el payload de forma asíncrona, lo que significa que no bloquea el hilo actual y en su lugar devuelve un objeto
Mono
que emite el payload cuando esté disponible.Al aceptar un payload reactivo, el segundo método permite un procesamiento de solicitudes más eficiente y receptivo, especialmente en escenarios de alta concurrencia. También permite una mejor utilización de los recursos del sistema y una mayor escalabilidad.
En cuanto a la implementación del código, el segundo método requiere el uso de tipos reactivos (en este caso, un objeto
Mono
) para procesar el payload y emitir la respuesta. El uso de tipos reactivos también permite una mejor composición de operaciones y programación declarativa.