我们可以发布一次流吗?

时间:2018-03-01 19:32:15

标签: java project-reactor

以下所有代码均无法打印任何内容。为什么呢?

ConnectableFlux<Integer> publish = Flux.just(1)
        .publish();

ConnectableFlux<Integer> publish1 = Flux.just(2)
        .flatMap(x -> publish)
        .publish();

publish1.subscribe(System.out::println, System.out::println, System.out::println);
publish1.connect();
ConnectableFlux<Integer> publish1 = Flux.just(2)
        .publish()
        .publish();

publish1.subscribe(System.out::println, System.out::println, System.out::println);
publish1.connect();
ConnectableFlux<Integer> publish1 = Flux.just(2)
        .publish()
        .doOnNext(System.out::println)
        .publish();

publish1.subscribe(System.out::println, System.out::println, System.out::println);
publish1.connect();

1 个答案:

答案 0 :(得分:1)

不要忘记为.connect

提供ConnectableFlux个离子

在所有这些示例中,都错过了.connect离子声明。

对于第一种情况,为了使其正常运行,我们还必须.connectpublish ConnectableFlux

ConnectableFlux<Integer> publish = Flux.just(1)
        .publish();

ConnectableFlux<Integer> publish1 = Flux.just(2)
        .flatMap(x -> publish)
        .publish();

publish1.subscribe(System.out::println, System.out::println, System.out::println);
publish1.connect();
publish.connect();

对于以下两个例子,我们有类似的东西。当我们使用Flux.just(...).publish().publish()时,我们会创建两个ConnectableFlux。这里的问题是第一个被删除。如果必须有后续的.publish(这是非常不合逻辑的),我们可以使用以下技术来避免删除之前的ConnectableFlux es:

ConnectableFlux<Integer> publish1 = Flux.just(2)
        .publish()
        .autoConnect() // or .autoConnect(0)
        .doOnNext(System.out::println)
        .publish();

publish1.subscribe(System.out::println, System.out::println, System.out::println);
publish1.connect();

在该示例中,我们使用.autoConnect()运算符,.autoConnect(0)只是ConnectableFlux#connectreturn this;语句的组合。如果使用.autoConnect(>0),则会对初始来源使用一些延迟订阅,这听起来像“只有当我们 N 订阅者时才连接到初始来源<” / p>