根据Project Reactor有关处理器的文档:
direct(DirectProcessor和UnicastProcessor):这些处理器可以 只通过直接用户操作推送数据(调用他们的Sink's 方法直接)。
synchronous(EmitterProcessor和ReplayProcessor):这些处理器 可以通过用户操作和订阅来推送数据 上游发布者并同步耗尽它。
UnicastProcessor
无法订阅上游Publisher
。该文档提供了直接用户Sink调用的示例:
UnicastProcessor<String> hotSource = UnicastProcessor.create();
Flux<String> hotFlux = hotSource.publish()
.autoConnect()
.map(String::toUpperCase);
hotFlux.subscribe(d -> System.out.println("Subscriber 1 to Hot Source: "+d));
hotSource.onNext("blue");
但是我尝试直接订阅UnicastProcessor
到Publisher
并且它有效。但是,如文档中所述,这是不可能的。如果我错过了某些文件吗?
在以下示例中,我正在将UnicastProcessor
订阅到上游Flux
,没有任何问题:
val latch = CountDownLatch(20)
val numberGenerator: Flux<Long> = counter(1000)
val processor = UnicastProcessor.create<Long>()
val connectableFlux = numberGenerator.subscribeWith(processor)
connectableFlux.subscribe {
logger.info("Element [{}]", it)
}
latch.await()
日志:
12:50:12.193 [main] INFO reactor.Flux.Map.1 - onSubscribe(FluxMap.MapSubscriber)
12:50:12.196 [main] INFO reactor.Flux.Map.1 - request(unbounded)
12:50:13.203 [parallel-1] INFO reactor.Flux.Map.1 - onNext(0)
12:50:13.203 [parallel-1] INFO com.codependent.Test - Element [0]
答案 0 :(得分:0)
是的,文档的这方面似乎已经过时了。即使DirectProcessor
也可以用作Subscriber
,并将信号传播给自己的订阅者。
注意:您在代码段中使用了EmitterProcessor
,但它与UnicastProcessor
的行为仍然相同。