Cómo utilizar Contexto con flatMap () en el Reactor?

Hubert:

Tengo un problema de comprensión contextual . Así documentaciones dice que Contexto es:

Una tienda de clave / valor que se propaga entre los componentes tales como los operadores a través del protocolo contexto. Los contextos son ideales para el transporte de la información ortogonal como el trazado o tokens de seguridad.

Excelente.

Ahora supongamos que queremos para propagar algo utilizando Contexto tenerlo en todas partes. Para llamar a otro código asíncrono simplemente usamos el flatMap () método.

Problema : ¿Cómo acceder Contexto dentro denominado método?

Muestra (simple) código:

public class TestFlatMap {
    public static void main(final String ...args) {
        final Flux<String> greetings = Flux.just("Hubert", "Sharon")
            .flatMap(TestFlatMap::nameToGreeting)
            .subscriberContext(context ->
                Context.of("greetingWord", "Hello")  // context initialized
            );
        greetings.subscribe(System.out::println);
    }

    private static Mono<String> nameToGreeting(final String name) {
        return Mono.just("Hello " + name + " !!!");  // ALERT: we don't have Context here
    }
}

El método llamado puede ser (y lo más probable será) en otra clase.

Gracias por la ayuda de antemano !

Editar : retira un poco de código para hacer la pregunta más conciso y directo al grano.

Por Dokuka:

Cadena tu Publishers y que el Contextestar contigo

En el caso, conectado todos sus Publishers (y esto incluye conexiones dentro de la flatMap/ concatMapy operadores similares) se ha Contextpropagado correctamente entre todo el tiempo de ejecución de flujo.

Para el acceso Contexten el nameToGreetingmétodo, puede llamar Mono.subscribeContexty recuperar información almacenada caso si parece que los métodos no están relacionados. A continuación se muestra el concepto antes mencionado:

public class TestFlatMap {
    public static void main(final String ...args) {
        final Flux<String> greetings = Flux.just("Hubert", "Sharon")
                                           .flatMap(TestFlatMap::nameToGreeting)
                                           .subscriberContext(context ->
                                                   Context.of("greetingWord", "Hello")  // context initialized
                                           );
        greetings.subscribe(System.out::println);
    }

    private static Mono<String> nameToGreeting(final String name) {
        return Mono.subscriberContext()
                   .filter(c -> c.hasKey("greetingWord"))
                   .map(c -> c.get("greetingWord"))
                   .flatMap(greetingWord -> Mono.just(greetingWord + " " + name + " " + "!!!"));// ALERT: we have Context here !!!
    }
}

Además, se puede hacer lo mismo de la siguiente manera, usando zipel operador, para combinar los resultados más adelante:

public class TestFlatMap {
    public static void main(final String ...args) {
        final Flux<String> greetings = Flux.just("Hubert", "Sharon")
                                           .flatMap(TestFlatMap::nameToGreeting)
                                           .subscriberContext(context ->
                                                   Context.of("greetingWord", "Hello")  // context initialized
                                           );
        greetings.subscribe(System.out::println);
    }

    private static Mono<String> nameToGreeting(final String name) {
        return Mono.zip(
            Mono.subscriberContext()
                .filter(c -> c.hasKey("greetingWord"))
                .map(c -> c.get("greetingWord")), // ALERT: we have Context here !!!
            Mono.just(name),
            (greetingWord, receivedName) -> greetingWord + " " + receivedName + " " + "!!!"
        );
    }
}

Por lo tanto, por qué funciona?

Como podemos ver en el ejemplo anterior, la nameToGreetingque se llama en el contexto de la principal Flux. Bajo el capó -> (Aquí algunos detalles internos FluxFlatMap) , cada una asignada Publisherestá suscrito por FlatMapInner. Si nos fijamos en el FlatMapInnery el aspecto de la currentContextanulación veremos, que FlatMapInnerusos de los padres Context, que significa que si el padre tiene un Reactor Context- entonces este contexto se propagará a cada interno Publisher.

Por lo tanto, devuelto por el nameToGreetingmétodo Monotendrá el mismo Contextcomo su padre

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=202510&siteId=1
Recomendado
Clasificación