我正在使用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场景中特别有用。
但在我的情况下,它没有记录任何错误,也没有记录任何有关丢失元素的消息。
如何获取有关丢失元素的信息?
请建议。
答案 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结束时,不会进一步读取流。希望很清楚。如果您真的想要获取流的最后一个元素,请尝试其他运算符。