项目反应堆:collectList()之后的block()对Flux.create()不起作用

时间:2018-10-15 17:26:56

标签: java spring reactor

当我在下面的示例中由collectList()返回的Mono <>实例上调用block()时,尽管在发射器上调用了complete(),我的代码仍然挂起。

我知道在大多数情况下不建议使用block()。我正在编写测试代码,并且使用起来似乎很合理-除了它不起作用之外。

下面的代码是this SO post的略微修改版本。

    ConnectableFlux<Integer> connect = Flux.<Integer>create(emitter -> {
        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
          .forEach(t -> emitter.next(t));
        emitter.complete();
    }).publish(); // EDIT <- use .replay() 

    connect.subscribe(v -> System.out.println("1: " + v));

    Mono<List<Integer>> mono = connect
            .filter(number -> number > 6)
            .collectList();

    mono.subscribe(v -> System.out.println("4: " + v));

    connect.connect();
    List<Integer> results = mono.block(); //hangs here

编辑:使用replay()而不是上面的注释中所示的publish()可以使block()像我最初期望的那样进行解析。

1 个答案:

答案 0 :(得分:1)

致电block()时,您已订阅MonoConnectableFlux,但未连接到助焊剂源。上一个connect.connect()不会影响此订阅。

您的最后一行可能是这样的:

List<Integer> results = connect
        .autoConnect()
        .filter(number -> number > 6)
        .collectList()
        .block();