Spring Webflux Reactor上下文

问题描述 投票:1回答:2

在下面的例子中,test2应该能够从contexttest访问test1值,但似乎没有发生这种情况。

欢迎任何见解。

参考文献:

  1. http://projectreactor.io/docs/core/release/reference/#context
  2. https://jira.spring.io/browse/SPR-15680
  3. https://simonbasle.github.io/2018/02/contextual-logging-with-reactor-context-and-mdc/import reactor.core.publisher.Mono; public class Test { public static void main(final String[] args) { System.out.println(Thread.currentThread().getName() + " main " + test()); } public static String test() { final String key = "message"; return test1().subscriberContext(ctx -> ctx.put(key, "test")).block(); } public static Mono<String> test1() { final String key = "message1"; return test2().subscriberContext(ctx -> ctx.put(key, "test1 ")); } public static Mono<String> test2() { return Mono.just("test2").map(item -> { Mono.subscriberContext().map(context -> { System.err.println(Thread.currentThread().getName() + " test2 " + context); return context; }); return item; }); }}

输出:

main main test2
java spring-boot spring-webflux project-reactor
2个回答
0
投票

似乎以下代码工作正常,但仍不确定为什么问题中的代码不起作用。

import reactor.core.publisher.Mono;

public class Test {

    public static void main(final String[] args) {
        System.out.println(Thread.currentThread().getName()
            + " main "
            + test());
    }

    public static String test() {
        final String key = "message";
        return test1().subscriberContext(ctx -> ctx.put(key, "test")).block();
    }

    public static Mono<String> test1() {
        final String key = "message1";
        return test2().flatMap(item -> {
            Mono.subscriberContext().map(context -> {
                System.err.println(Thread.currentThread().getName()
                    + " test1 "
                    + context);
                return context;
            });
            return Mono.just(item);
        }).subscriberContext(ctx -> ctx.put(key, "test1 "));
    }

    public static Mono<String> test2() {
        final String key = "message2";
        return Mono.subscriberContext().flatMap(context -> {
            System.err.println(context);
            return Mono.just("test2");
        }).subscriberContext(ctx -> ctx.put(key, "test2"));
    }

}

0
投票

我想,你想在test2()中访问订阅者上下文,对吧?这只适用,如果你实际上在同一个流程中,那么这段代码将修复原始代码:原文:

public static Mono<String> test2() {
    return Mono.just("test2").map(item -> {
        // you're creating a new Mono context here, and don't return it/use it anymore
        Mono.subscriberContext().map(context -> {
            System.err.println(Thread.currentThread().getName()
                + " test2 "
                + context);
            return context;
        });
        return item;
    });

固定(尽可能少的更改,可以美化):

public static Mono<String> test2() {
  return Mono.just("test2").flatMap(item -> { // changed map to flatmap, otherwise would be Mono<Mono<String>> here
    Mono<Context> contextMono = Mono.subscriberContext()
        .map(context -> {
          System.err.println(Thread.currentThread()
                                 .getName() + " test2 " + context);
          return context;
        });
    // let item be returned from "inside" of context Mono
    return contextMono.map(context -> item);
  });

我一直在努力使用subscribercontext - 我发现它不是很清楚,当上下文按预期使用时,以及何时没有使用。我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.