我在下面的客户端-服务器交互中看到了一些奇怪的行为,我想知道我是遇到了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规范中的一部分,在收到完整的请求体之前不应该发送响应头?
发布于 2020-11-09 04:33:42
请看这个问题:WebClient doesn't read response until request write is completed.
显然,基于Netty的WebClient只有在发送完请求后才开始处理响应
Netty服务器可能也有类似的行为(仅在读取完请求正文后才开始发送响应),我不确定
有趣的是,基于Jetty的WebClient能够同时处理请求和响应
https://stackoverflow.com/questions/59178429
复制相似问题