Java反应器未完成不一致性
我肯定我错过了什么。我正在运行以下代码:Java反应器未完成不一致性,java,project-reactor,Java,Project Reactor,我肯定我错过了什么。我正在运行以下代码: @Test public void simpleCreation() throws Exception { Iterator<String> data = ImmutableList.of("1", "2", "3").iterator(); Flux<String> stringFlux = Flux.create(emmiter -> { while ( data.hasNext() )
@Test
public void simpleCreation() throws Exception {
Iterator<String> data = ImmutableList.of("1", "2", "3").iterator();
Flux<String> stringFlux = Flux.create(emmiter -> {
while ( data.hasNext() ) {
emmiter.next(data.next());
}
emmiter.complete();
});
ConnectableFlux<String> connectableFlux = stringFlux.publish();
connectableFlux.doOnComplete(() -> System.out.println("connectableFlux.doOnComplete"));
stringFlux.doOnComplete(() -> System.out.println("stringFlux.doOnComplete"));
CountDownLatch completeLatch = new CountDownLatch(1);
Disposable disposable = connectableFlux.subscribe(s -> {
System.out.println("subscribe: data: " + s);
}, error -> { }, completeLatch::countDown);
connectableFlux.connect();
completeLatch.await();
disposable.dispose();
}
@测试
public void simpleCreation()引发异常{
迭代器数据=ImmutableList.of(“1”、“2”、“3”).Iterator();
通量字符串通量=通量。创建(emmiter->{
while(data.hasNext()){
emmiter.next(data.next());
}
emmiter.complete();
});
ConnectableFlux ConnectableFlux=stringFlux.publish();
connectableFlux.doOnComplete(()->System.out.println(“connectableFlux.doOnComplete”);
stringFlux.doOnComplete(()->System.out.println(“stringFlux.doOnComplete”);
CountDownLatch completeLatch=新的CountDownLatch(1);
一次性=可连接流量。订阅(s->{
System.out.println(“订阅:数据:+s”);
},错误->{},completeLatch::倒计时);
connectableFlux.connect();
completeLatch.await();
一次性的,一次性的;
}
并期望它打印“connectableFlux.doOnComplete”或“stringFlux.doOnComplete”或两者,但我看不到。从subscribe方法执行OnComplete回调没有问题,但是这两个方法都没有被调用,我也不太明白为什么
对我来说,这看起来有点不一致——在一个地方调用回调,而其他地方则被忽略。我可以观察到doOnNext的类似行为
如果有人能解释这背后的概念,我将不胜感激。我确信这不是bug,只是我在框架或总体概念上遗漏了一些东西。这一行导致了问题:
connectableFlux.doOnComplete(() -> System.out.println("connectableFlux.doOnComplete"));
调用doOnComplete()
的结果将被忽略。该方法返回要在其上调用subscribe()
的Flux实例的新版本,它不会将逻辑添加到旧的connectableFlux
实例
试着这样做:
Iterator<String> data = ImmutableList.of("1", "2", "3").iterator();
Flux<String> stringFlux = Flux.create(emmiter -> {
while (data.hasNext()) {
emmiter.next(data.next());
}
emmiter.complete();
});
stringFlux.doOnComplete(() -> System.out.println("stringFlux.doOnComplete()"))
.subscribe(s -> System.out.println("subscribe: data: " + s), error -> {})
.dispose();
stringFlux.publish().connect();
Iterator data=ImmutableList.of(“1”、“2”、“3”).Iterator();
通量字符串通量=通量。创建(emmiter->{
while(data.hasNext()){
emmiter.next(data.next());
}
emmiter.complete();
});
stringFlux.doOnComplete(()->System.out.println(“stringFlux.doOnComplete()”)
.subscribe(s->System.out.println(“订阅:数据:+s),错误->{})
.dispose();
stringFlux.publish().connect();
这一行导致了以下问题:
connectableFlux.doOnComplete(() -> System.out.println("connectableFlux.doOnComplete"));
调用doOnComplete()
的结果将被忽略。该方法返回要在其上调用subscribe()
的Flux实例的新版本,它不会将逻辑添加到旧的connectableFlux
实例
试着这样做:
Iterator<String> data = ImmutableList.of("1", "2", "3").iterator();
Flux<String> stringFlux = Flux.create(emmiter -> {
while (data.hasNext()) {
emmiter.next(data.next());
}
emmiter.complete();
});
stringFlux.doOnComplete(() -> System.out.println("stringFlux.doOnComplete()"))
.subscribe(s -> System.out.println("subscribe: data: " + s), error -> {})
.dispose();
stringFlux.publish().connect();
Iterator data=ImmutableList.of(“1”、“2”、“3”).Iterator();
通量字符串通量=通量。创建(emmiter->{
while(data.hasNext()){
emmiter.next(data.next());
}
emmiter.complete();
});
stringFlux.doOnComplete(()->System.out.println(“stringFlux.doOnComplete()”)
.subscribe(s->System.out.println(“订阅:数据:+s),错误->{})
.dispose();
stringFlux.publish().connect();
我不能将此作为评论添加,很抱歉,我碰到了一个老问题。我只是想分享一下官方的反应堆指南:
B.2。我在通量上使用了操作符,但它似乎不适用。有什么好处?
确保.subscribe()所使用的变量受到您认为应该应用于它的运算符的影响
反应堆操作员是装修工。它们返回一个不同的实例来包装源序列并添加行为。这就是为什么使用接线员的首选方式是连接呼叫
比较以下两个示例:
无链接(不正确)
鉴于其他两个版本将输出预期的:
我不能将此作为评论添加,很抱歉,我打断了一个老问题。我只是想分享一下官方的反应堆指南: B.2。我在通量上使用了操作符,但它似乎不适用。有什么好处? 确保.subscribe()所使用的变量受到您认为应该应用于它的运算符的影响 反应堆操作员是装修工。它们返回一个不同的实例来包装源序列并添加行为。这就是为什么使用接线员的首选方式是连接呼叫 比较以下两个示例: 无链接(不正确) 鉴于其他两个版本将输出预期的:
Flux<String> secrets = Flux
.just("foo", "chain")
.map(secret -> secret.replaceAll(".", "*"))
.subscribe(next -> System.out.println("Received: " + next));
Received: foo
Received: chain
Received: ***
Received: *****