【问题标题】:Is Reactor Context used only for statically initialised data?Reactor Context 是否仅用于静态初始化的数据?
【发布时间】:2020-09-08 22:11:35
【问题描述】:

考虑以下 4 行代码:

Mono<Void> result = personRepository.findByNameStartingWith("Alice")
                                    .map(...)
                                    .flatMap(...)
                                    .subscriberContext()

我希望您能立即将其映射到您的实际任务需求的虚构用例:

如何将“Alice”添加到上下文中,以便在 .map() 之后,“Alice”不再是 Person.class 而是 Cyborg.class(假设不可逆转的转换),在 .flatMap() 中我可以访问原始“爱丽丝”Person.class。我们想在.flatMap() 内部比较“爱丽丝”人与“爱丽丝”机器人的实力,然后将他们都送上月球建造殖民地。

所以我得出的结论是,其他东西被命名为“上下文”,大多数人不能将其用于上面的压倒性用例。

我必须坚持使用元组和包装器吗?或者我完全是假的,有办法。我需要这个上下文以完全相反的方向工作:-),除非“这个”上下文不是我需要的上下文。

【问题讨论】:

  • 响应式和函数式编程鼓励不变性。我认为这是不可能的主要原因(很容易)。此外,Reactor 已经是一个非常复杂的野兽。如果你在混合中添加一个可变上下文,它很快就会变成一场噩梦。

标签: project-reactor


【解决方案1】:

我将等待 Reactor 开发人员的关注(或者在此之后去 GitHub 提出概念命名错误的问题,如果我是正确的),但与此同时。我相信 Reactor Context 可以解决这个问题:

What is the efficient/proper way to flow multiple objects in reactor

但它实际上提醒的是对向下传播的反应性管道进行某种大型关闭->向上并以命令式的方式接受来自外部的值,IMO 是一个非常狭窄且有限的用例,被称为“上下文”,这会让更多的人感到困惑。

【讨论】:

    【解决方案2】:

    Context 和你提到的帖子中的 subscribeContext 确实是一回事...

    Context 的目标更接近于将一些信息附加到给定的订阅。

    这是有效的,因为在订阅时,Subscriber 链被构造为“实现”处理,并且本质上每个给定的运算符(或步骤)作为对其下游的引用,以便能够将数据推送到它.

    因此,它还可以查询它对当前订阅 Context 的看法,因此采用自下而上的方法。

    【讨论】:

    • 旁注,它不太可能被反转并且在运行时是可变的,在提出要求它的问题时几乎没有用处。
    • 公平地说,我强调的是当前的实现非常有限。如果我读到这个“使用 ThreadLocal 的通常解决方法是使用(例如)Tuple2 将上下文数据 C 沿您的业务数据 T 按顺序移动。这看起来不太好,而且将正交关注点(上下文数据)泄漏到您的方法和 Flux 签名中。”来自官方文档。我得到一个提示,它旨在替换 ThreadLocal ,由于阻塞编程的性质,ThreadLocal 比 Context 灵活得多。
    • 不确定您是否考虑过这一点,但如果您想更改数据路径上的内容,一种模式是向Context 添加一个可变容器
    • mm,但这与直接使用可变容器没有什么不同,它变得非常丑陋,我想我有一些幻想,反应堆会以某种方式帮助我,我正在使用 mono.cache( ) 然后我映射和 flatMap 这个单声道,然后我 zipWith 再次需要这个缓存的单声道初始实例。我知道这听起来有点愚蠢,但至少我不需要在整个链上携带元组。也许你有更好的建议,因为当类型已经改变而没有 TT 时,我实际上需要传送 Mono/Flux 以便稍后使用几个操作符(总元组化 :-D)
    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多