当我在下面的示例中由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()像我最初期望的那样进行解析。
答案 0 :(得分:1)
致电block()
时,您已订阅Mono
和ConnectableFlux
,但未连接到助焊剂源。上一个connect.connect()
不会影响此订阅。
您的最后一行可能是这样的:
List<Integer> results = connect
.autoConnect()
.filter(number -> number > 6)
.collectList()
.block();