Mono.subscriberContext () возвращает старый контекст - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть класс PublishContext с методом context () следующим образом:

public static Mono<Object> context(){

    return Mono.empty().subscriberContext( context -> {
        Context context1 = context.put("key", "hello");
        System.out.println((String) context1.get("key"));
        return context1;
    });
}

В вышеприведенном коде контекстный объект - Context0 @ 744, а context1 - Context @ 747, который понятен, так как контекст неизменен ивсегда возвращает новый контекст.

В моем основном классе у меня есть следующий код:

public static void main(String[] args) {

    Mono<Object> objectMono = PublishContext.context();
    objectMono.subscribe();

    Mono<Object> objectMono1 = Mono.subscriberContext().flatMap(context ->       {
        System.out.println((String) context.get("key"));
        return Mono.empty();
    });
    objectMono1.subscribe();
}

Здесь я получаю контекст как Context0 @ 744, т.е. Старый контекст и, следовательно, получаяисключение "контекст пуст".Может кто-нибудь объяснить, пожалуйста, это поведение?Кроме того, как я могу получить доступ к context0 @ 747, который я возвращаю из метода context ()?

1 Ответ

0 голосов
/ 22 февраля 2019
  • A) запись Context должна быть частью той же цепочки операторов
  • B) она должна быть "ниже по течению" той части, где вам нужно ее прочитать

Таким образом, «автономная» последовательность, в которой у вас есть источник (Mono.empty()), запись Context (.subscriberContext(...)) И последний шаг подписки (objectMono.subscribe()), не 'Это не имеет большого смысла.

Может быть, попытаться превратить context() в метод украшения?

public static <T> Mono<T> addContext(Mono<T> source){
    return source.subscriberContext( context -> {
        Context context1 = context.put("key", "Hello");
        System.out.println((String) context1.get("key"));
        return context1;
    });
}

Затем примените и прочитайте его:

public static void main(String[] args) {
    Mono<String> mono = Mono.just("foo")
        .flatMap(value -> Mono.subscriberContext()
            .map(ctx -> value + context.getOrDefault("key", "UNKNOWN"))
        );
    Mono<String> monoWithCtxWrite = addContext(mono);

    mono.subscribe(System.out::println)
    monoWithCtxWrite.subscribe(System.out::println);
}

Это печатает (при условииглавное не выходит слишком рано):

fooUNKNOWN
fooHello
...