Flux.zip方法不会发出所有元素

时间:2018-01-02 10:23:43

标签: project-reactor reactive-streams

我正在使用Reactive Stream和Publishers(Mono和Flux),并使用Flux的zip和zipWith方法将两个发布者合并如下:

Flux<String> flux1 = Flux.just(" {1} ","{2} ","{3} ","{4} " );
Flux<String> flux2 = Flux.just(" |A|"," |B| "," |C| ");
Flux.zip(flux1, flux2,
                    (itemflux1, itemflux2) -> "[ "+itemflux1 + ":"+ itemflux2 + " ] " )
            .subscribe(System.out::print);

这是输出:

[  {1} : |A| ] [ {2} : |B|  ] [ {3} : |C|  ] 

AS flux1有四个元素,flux2有三个元素,flux1中的第四个元素丢失。当我试图打印磁通的日志时,没有关于第四个元素发生了什么的信息。

以下是打印日志的声明:

Flux.zip(flux1, flux2,
                (itemflux1, itemflux2) -> "[ "+itemflux1 + ":"+ itemflux2 + " ] " ).log()
        .subscribe(System.out::print);

以下是使用log方法的控制台日志:

[info] onSubscribe(FluxZip.ZipCoordinator)
[info] request(unbounded)
[info] onNext([  {1} : |A| ] )
[  {1} : |A| ] [info] onNext([ {2} : |B|  ] )
[ {2} : |B|  ] [info] onNext([ {3} : |C|  ] )
[ {3} : |C|  ] [info] onComplete()

从zip方法的文档中,我得到了

  

操作员将继续这样做,直到任何来源完成。错误将立即转发。这种“Step-Merge”处理在Scatter-Gather场景中特别有用。

但在我的情况下,它没有记录任何错误,也没有记录任何有关丢失元素的消息。

如何获取有关丢失元素的信息?

请建议。

3 个答案:

答案 0 :(得分:2)

zip / zipWith将输出与最短Flux 中的元素一样多的对。它会在最小的Flux终止后取消log(),如果您将Flux放在源hide()而不是压缩的zipWith(..., 1)上,则应该可以看到它。

此代码段(已调整为显示1-by-1请求并作为单元测试运行,因此blockLast() / @Test public void test() { Flux<Integer> flux1 = Flux.range(1, 4).hide().log("\tFLUX 1"); Flux<Integer> flux2 = Flux.range(10, 2).hide().log("\tFlux 2"); flux1.zipWith(flux2, 1) .log("zipped") .blockLast(); } 11:57:21.072 [main] INFO zipped - onSubscribe(FluxZip.ZipCoordinator) 11:57:21.077 [main] INFO zipped - request(unbounded) 11:57:21.079 [main] INFO FLUX 1 - onSubscribe(FluxHide.HideSubscriber) 11:57:21.079 [main] INFO FLUX 1 - request(1) 11:57:21.079 [main] INFO FLUX 1 - onNext(1) 11:57:21.079 [main] INFO Flux 2 - onSubscribe(FluxHide.HideSubscriber) 11:57:21.080 [main] INFO Flux 2 - request(1) 11:57:21.080 [main] INFO Flux 2 - onNext(10) 11:57:21.080 [main] INFO zipped - onNext([1,10]) 11:57:21.080 [main] INFO FLUX 1 - request(1) 11:57:21.080 [main] INFO FLUX 1 - onNext(2) 11:57:21.080 [main] INFO Flux 2 - request(1) 11:57:21.080 [main] INFO Flux 2 - onNext(11) 11:57:21.080 [main] INFO zipped - onNext([2,11]) 11:57:21.080 [main] INFO FLUX 1 - request(1) 11:57:21.080 [main] INFO FLUX 1 - onNext(3) 11:57:21.080 [main] INFO Flux 2 - request(1) 11:57:21.080 [main] INFO Flux 2 - onComplete() 11:57:21.081 [main] INFO FLUX 1 - cancel() <----- HERE 11:57:21.081 [main] INFO Flux 2 - cancel() 11:57:21.081 [main] INFO zipped - onComplete() )<: / p>

"until any of the sources completes"

哪个输出:

.dropdown-content
  display: none
  position: absolute
  background-color: transparent
  min-width: 100px  
  box-shadow: unset

这是def fibk(n, k): A = 2**(n+k+1) M = A**k - A**k // (A - 1) return pow(A, n+k, M) % A for k in xrange(1, 10): print ', '.join(str(fibk(n, k)) for n in xrange(15)) 部分。

答案 1 :(得分:1)

这是此运算符的预期行为。 使用Flux.zip,其中一个Flux可能是无限的;一个常见的例子是使用Flux实例(无限)压缩Flux.interval(Duration duration)数据。

如果您遇到这种情况,可能意味着您需要使用其他操作员。

答案 2 :(得分:0)

解释文件说明的内容    会立即转发错误。 - &gt;表示如果组合函数中存在错误,则立即转发。您可以通过将其中一个条目中的一个条目设为空来检查这一点。

无法获得丢失的元素。因为当其中一个Stream结束时,不会进一步读取流。希望很清楚。如果您真的想要获取流的最后一个元素,请尝试其他运算符。