Solución:
Es un poco una simplificación excesiva, pero conceptualmente las fuentes de Reactor son vagas o ansiosas. Se espera que los más avanzados, como una solicitud HTTP, se evalúen con pereza. Por otro lado los más sencillos como Mono.just
o Flux.fromIterable
están ansiosos.
Con eso, me refiero a que llamar Mono.just(System.currentTimeMillis())
Invocará inmediatamente el currentTimeMillis()
método y capturar el resultado. Dicho resultado es solo emitido por el Mono
una vez suscrito. Suscribirse varias veces tampoco cambia el valor:
Mono<Long> clock = Mono.just(System.currentTimeMillis());
//time == t0
Thread.sleep(10_000);
//time == t10
clock.block(); //we use block for demonstration purposes, returns t0
Thread.sleep(7_000);
//time == t17
clock.block(); //we re-subscribe to clock, still returns t0
los defer
El operador está ahí para hacer que esta fuente sea perezosa, reevaluando el contenido de la lambda cada vez que hay un nuevo suscriptor:
Mono<Long> clock = Mono.defer(() -> Mono.just(System.currentTimeMillis()));
//time == t0
Thread.sleep(10_000);
//time == t10
clock.block(); //invoked currentTimeMillis() here and returns t10
Thread.sleep(7_000);
//time == t17
clock.block(); //invoke currentTimeMillis() once again here and returns t17
con palabras simples si ves en la primera vista es como Mono.just () pero no lo es. cuando ejecuta Mono.just (), crea inmediatamente un Observable (Mono) y lo reutiliza, pero cuando usa diferir, no lo crea de inmediato, crea un nuevo Observable en cada suscripción.
Un caso de uso para ver la diferencia
int a = 5;
@Override
public void run(String... args) throws Exception {
Mono<Integer> monoJust = Mono.just(a);
Mono<Integer> monoDefer = Mono.defer(() -> Mono.just(a));
monoJust.subscribe(integer1 -> System.out.println(integer1));
monoDefer.subscribe(integer1 -> System.out.println(integer1));
a = 7;
monoJust.subscribe(integer1 -> System.out.println(integer1));
monoDefer.subscribe(integer1 -> System.out.println(integer1));
}
impresión: 5,5,5,7
si ve mono.just ha creado lo observable de inmediato y no cambia incluso si el valor ha cambiado, pero el diferido crea lo observable en la suscripción, por lo que trabajará con el valor actual de suscripción