首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring Reactive WebClient同时流式传输请求/响应主体?

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

Stack Overflow用户
提问于 2019-12-04 22:34:47
回答 1查看 827关注 0票数 2

我在下面的客户端-服务器交互中看到了一些奇怪的行为,我想知道我是遇到了HTTP/1.1语义,还是我的反应式编程技能需要努力(或者两者兼而有之)。

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

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

代码语言:javascript
复制
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应用程序,用于在接收到请求对象时记录它们,并提供无限的结果流:

代码语言:javascript
复制
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规范中的一部分,在收到完整的请求体之前不应该发送响应头?

EN

回答 1

Stack Overflow用户

发布于 2020-11-09 04:33:42

请看这个问题:WebClient doesn't read response until request write is completed.

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59178429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档