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中。我试图弄清楚这是如何做到的,也是为了单元测试的目的。
最后,这仍然是一个谜。我试图用单声道/通量对象上可用的常规方法来做到这一点,但是我没有成功地使你好上下文对世界单声道可用。你如何融合通量和单声道,并将上下文传递给上游操作符?
WebFlux利用你的世界
Mono并在其上构建一个反应链,以reactor netty中的HTTP请求作为最终源。WebFilter
是链构造的一部分,因此它们可以丰富整个链的上下文。
IIRC
Mono.subscriberContext()
将在一个平映射
中使用,这使得主序列Context
对其内部人员可用,因此它可以看到Hello
的Context
。
你想做几件事:
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 它可以返回我期望的结果。然后我尝试创建另一个方法来支持列表作为参数 但这一次返回一个奇怪的结果。 我是反应式编程新手,将流和单声道结合起来,然后转换为流量的正确方法是什么?