Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反应器未完成不一致性_Java_Project Reactor - Fatal编程技术网

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: *****