DirectProcessor和UnicastProcessor可以在不应该订阅上游Publisher时订阅它们。为什么呢?

时间:2018-03-28 10:52:22

标签: spring reactive-programming project-reactor

根据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");

但是我尝试直接订阅UnicastProcessorPublisher并且它有效。但是,如文档中所述,这是不可能的。如果我错过了某些文件吗?

在以下示例中,我正在将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]

1 个答案:

答案 0 :(得分:0)

是的,文档的这方面似乎已经过时了。即使DirectProcessor也可以用作Subscriber,并将信号传播给自己的订阅者。

注意:您在代码段中使用了EmitterProcessor,但它与UnicastProcessor的行为仍然相同。