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

将上下文从一个通量/单声道传递到另一个通量/单声道

汪甫
2023-03-14

webflux包中发生了有趣的事情。然而,我在源头的旅程并没有解决以下问题。

假设我有以下单声道(或通量):

Mono hello = Mono.empty()
            .subscriberContext(ctx -> ctx.put("message", "hello"));

我在webfilter中使用类似的构造,用租户和用户数据丰富管道。然后在控制器中使用如下构造:

Mono world = Mono.subscriberContext()
            .map(ctx -> (String)ctx.get("message"));

hello mono的上下文填充在world mono中。我试图弄清楚这是如何做到的,也是为了单元测试的目的。

最后,这仍然是一个谜。我试图用单声道/通量对象上可用的常规方法来做到这一点,但是我没有成功地使你好上下文对世界单声道可用。你如何融合通量和单声道,并将上下文传递给上游操作符?

共有2个答案

易淳
2023-03-14

WebFlux利用你的世界Mono并在其上构建一个反应链,以reactor netty中的HTTP请求作为最终源。WebFilter是链构造的一部分,因此它们可以丰富整个链的上下文。

IIRCMono.subscriberContext()将在一个平映射中使用,这使得主序列Context对其内部人员可用,因此它可以看到HelloContext

曹奇文
2023-03-14

你想做几件事:

1.)发布订阅服务器上下文

mono.subscriberContext({ Context context ->
    context.put("key", "value")
})

2.)订阅/访问用户上下文

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        context.get("key")
        context.get("keyOrMapOrStateObject").put("someKey", "someData")
        return r
    })
})

3.)可能将数据从一个事件传递到下游事件

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        def someData = context.get("keyOrMapOrStateObject").get("someKey")
        return r
    })
})

总的来说,它看起来像:(这是groovy语法)

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        context.get("key")
        context.get("keyOrMapOrStateObject").put("someKey", "someData")
        return r
    })
}).flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        def someData = context.get("keyOrMapOrStateObject").get("someKey")
        return r
    })
}).subscriberContext({ Context context ->
    context.put("key", "value")
    context.put("keyOrMapOrStateObject", new HashMap())
})

这是一个粗略的大纲——还没有准备好“原样”,但它应该有助于你理解模式。

祝你好运

 类似资料:
  • 我最近一直在学习使用Java中的reactor库和Spring框架进行反应式编程,并且在很大程度上我已经能够掌握它。然而,我发现自己有好几次遇到同样的情况,我想知道我哪里出了问题。 我正在努力解决的问题的要点是,我经常想用mono做一些事情,比如找到一些补充数据,然后将其添加回原始mono中。zip函数在我看来是一个理想的候选函数,但最终我订阅了两次原始mono,这不是我的意图。 这里有一个人为的

  • 使用spring 5,对于reactor,我们有以下需求。 什么方法可以转换单声道

  • 我在玩r2dc for spring boot java应用程序。 我在想,如果可能的话,可以把通量转换成Mono来进行某种计算。 伪示例:

  • 我面临的情况是,我必须使用2 Mono,其中第二个将依赖于第一个的Id字段,并在第一个Mono的主体中返回第二个的响应。 例如: 然后将结果返回为 我试过了 但像这样,我只能返回第二个单声道的响应。 通过尝试Map或Flatmap,它只在第二个单声道上起作用。 请提出建议。

  • 我的代码如下。我需要从mongo db获得每次旅行的车费,然后将每次旅行的所有车费相加,得到总车费。我被一种我不知道如何阅读的单声道音乐所困扰。我试着把它转换成通量,但我得到了通量 "'

  • 我有一个方法,可以尝试使用WebClient返回Mono 它可以返回我期望的结果。然后我尝试创建另一个方法来支持列表作为参数 但这一次返回一个奇怪的结果。 我是反应式编程新手,将流和单声道结合起来,然后转换为流量的正确方法是什么?