繁体   English   中英

使用 Spring Reactive WebClient 同时流式传输请求/响应主体?

[英]Simultaneously streaming request / response bodies with the Spring Reactive WebClient?

我在以下客户端 - 服务器交互中看到了一些奇怪的行为,我想知道我是否遇到了 HTTP/1.1 语义或我的响应式编程技能需要工作(或两者)。

我正在尝试创建一个客户端-服务器交互,其中请求和响应主体都是长时间运行的数据流。

客户端是一个 Spring Reactive WebClient,它在请求正文中发送一个无限流。 它期望接收(并记录)无限的结果流。

Flux<Long> requests = Flux.interval(Duration.ofSeconds(2));

return WebClient.create()
        .post()
            .uri("/instructions")
            .contentType(MediaType.APPLICATION_STREAM_JSON)
            .body(requests, Long.class)
        .retrieve()
            .bodyToFlux(Object.class)
            .map(response -> {
                log.info("Received Response Object {}", response);
                return response;
            });

服务器是一个带有路由处理程序的spring-boot-starter-webflux应用程序,用于记录接收到的请求对象并提供无限的结果流:

public Mono<ServerResponse> instructions(ServerRequest request) {
    // Log the request objects as they are received
    Flux<Object> requestStream = request.bodyToFlux(Object.class)
            .map(r -> {
                log.info("Received Request Object: {}", r);
                return r;
            });

    requestStream.subscribe();

    // Infinite stream of responses
    Flux<Long> responses = Flux.interval(Duration.ofSeconds(5));

    return ServerResponse.ok()
            .contentType(MediaType.APPLICATION_STREAM_JSON)
            .body(responses, Long.class);
}

当上面的代码运行时,服务器记录请求对象的无限流,但客户端从不记录任何响应对象。

如果我通过执行以下操作来绑定请求流: Flux<Long> requests = Flux.interval(Duration.ofSeconds(2)).take(20); 然后客户端在收到所有请求后开始记录响应。

这里有什么问题? * 反应式代码有问题吗? * 这是 HTTP/1.1 规范的一部分,在完全接收到请求正文之前不应发送响应标头吗?

请参阅此问题: WebClient 在请求写入完成之前不会读取响应。

显然,基于 Netty 的 WebClient 只有在完成发送请求后才开始处理响应

Netty 服务器的行为也可能类似(仅在完成读取请求正文后才开始发送响应),我不确定

有趣的是,基于 Jetty 的 WebClient 能够同时处理请求和响应

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM