Project Reactor:我需要处理器吗?

时间:2019-07-24 11:03:28

标签: java reactive-programming project-reactor reactor reactive-streams

我正在尝试在Reactor之上设计管道框架。

在每个阶段(不考虑第一个和最后一个阶段),我们都会执行一些任务来转换对象(即,将字符串转换为其长度,或者将其网址转换为HTML内容等)。这是一个示例:

enter image description here

您会看到中间层有3个任务,每个任务将X对象转换为Y对象(顺便说一句,它始终是完全连接的层)

我的问题/困境: 我首先想到的是,我需要做的是Flux.merge(),然后将其连接到每个订户。例如:

Flux<X> source = Flux.merge(x1Flux, x2Flux)  
source.subscribe(y1Subscriber)
source.subscribe(y2Subscriber)

另一种选择是放置一个处理器(TopicProcessor?)作为中间件(就像在pub-sub模式中一样)

我缺乏对哪种解决方案最适合我的问题的理解。从逻辑上讲是相同的,但是每种架构的实际含义是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

我在这里的一般方法是使用ConnectableFlux,以便延迟发布,直到您完成整个管道设置为止,然后在建立管道后在每个通量上调用connect()

可以使用处理器,但我建议尽可能避免使用该处理器。

一般要点(不检查语法)类似于:

ConnectableFlux<String> x1 = Flux.just("x1").publish();
ConnectableFlux<String> x2 = Flux.just("x2").publish();

ConnectableFlux<String> y1 = Flux.<String>from(Flux.merge(x1, x2)).publish();
ConnectableFlux<String> y2 = Flux.<String>from(Flux.merge(x1, x2)).publish();
ConnectableFlux<String> y3 = Flux.<String>from(Flux.merge(x1, x2)).publish();

ConnectableFlux<String> z3 = Flux.<String>from(Flux.merge(y1, y2, y3)).publish();

x1.connect();
x2.connect();
y1.connect();
//...etc.

还要注意,您可能希望使用concat()mergeSequential()而不是merge(),具体取决于您的用例(merge()会急切地订阅发布者,{{1 }}不会,concat()会按照接收到的顺序合并,可能会交错插入值。)