当前位置: 首页 > 知识库问答 >
问题:

Spring WebfluxReactor上下文

曹伟泽
2023-03-14

>

  • http://projectreactor.io/docs/core/release/reference/#context
  • https://jira.spring.io/browse/spr-15680
  • 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
    
  • 共有1个答案

    锺离声
    2023-03-14

    我想,您希望访问test2()中的订阅者上下文,对吗?只有当您实际上在同一个流中时,这才有效,所以这个片段将修复原始代码:original:

    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作斗争--我发现它不是很清楚,什么时候上下文是按预期使用的,什么时候不是。我希望这能有所帮助。

     类似资料:
    • 通过 Context 可以获取到 *Request 和 ResopnseWriter 。同时还有一些方便的函数可以进行操作。 Req() 获取到*Request对象。 Forms() 可以获取表单提交内容,具体参见 Forms Cookies() 获取到Cookies对象并进行操作。 SecureCookies() 获取到安全Cookie对象并进行操作。 ServeFile() 将文件发送给浏览器

    • 我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父上下文继承bean/资源,然后根据需要添加更多bean/资源来覆盖它们。但是,当子上下文关闭时(退出try/catch作用域),它开始对它引用的所有bean进行清理,包括父作用域中的bean。这是不可取的,因为我需要重用父上下文来创建另一个子上下文,但是现在它是垃圾,因为它包含了一堆已处理/关闭的bean。 问题

    • 在React中,在React组件中很容易追踪数据流。当你观察组件时,你可以找出哪些属性(props)被传递,这使得你的应用非常容易理解。 在某些场景下,你想在整个组件树中传递数据,但却不想手动地在每一层传递属性。你可以直接在React中使用强大的context API解决上述问题。 为什么不要使用Context 绝大多数的应用程序不需要使用context。 如果你希望使用应用程序更加稳定就不要使用

    • Koa Context 将 node 的 request 和 response 对象封装在一个单独的对象里面,其为编写 web 应用和 API 提供了很多有用的方法。 这些操作在 HTTP 服务器开发中经常使用,因此其被添加在上下文这一层,而不是更高层框架中,因此将迫使中间件需要重新实现这些常用方法。 context 在每个 request 请求中被创建,在中间件中作为接收器(receiver)来

    • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

    • 在 Blade 2.0.9 版本后加入了 RouteContext 这个类,作为路由的上下文操作。其本质是封装了 Request 和 Response,所以使用起来和它们的 API 是相同的,下面列举一下包含的方法列表。 请求相关 #request() #method() #uri() #keepAlive() #session() #isIE() #header(String headerNam