事件何时会在服务器上产生,并将MediaType.TEXT_EVENT_STREAM发送给客户端上的订阅者

时间:2019-07-12 09:21:21

标签: java spring spring-webflux reactor-netty

我创建了一个示例客户端/服务器应用程序,以熟悉Spring Webflux / Reactor Netty。现在,当响应包含Flux且媒体类型为“文本/事件流”时,我对客户端的行为有些困惑。我看到的是,服务器上产生的每个元素都立即发送给客户端,但尚未传递给订户。在服务器端的生产者完成Flux之后,首次交付给订户。 对我来说,这意味着所有元素都首先收集到客户端的反应堆网络中的某个位置,直到它收到完整/错误事件为止。

我的结论是对的还是在那做错了什么? 如果属实,这会在不久的将来改变吗?根据我目前观察到的行为,使用Spring Webflux的大多数好处都被否定了,因为与Spring Mvc一样,消费者必须等到创建并转移了整个元素集合之后,才能开始使用元素。

1 个答案:

答案 0 :(得分:0)

取自反应性文档,并进行了重写以适合您的需求。

我的猜测是,在您的示例中,您已给您传递了generate函数一个消费者,该消费者在完成时将被发出。

通过使用方法Flux#generate(Callable<S> stateSupplier, BiFunction<S,SynchronousSink<T>,S> generator)来提供一个包含要发出的项目的状态,然后在提供的BiFunction中,一一发出每个项目。

Flux<String> flux = Flux.generate(
    () -> List.of("1!", "2!", "3!", "4!", "5!"), 
    (state, sink) -> {
        if (index == allStrings.size()) {
            sink.complete();
        } else {
          sink.next(state.get(index++));
        } 
    });

我还没有测试用手机编写的代码。