当使用SpringWebClient时,由于HttpClientOperations接收到最后一个HTTP数据包,连接被



我正在使用Spring WebClient从我的服务器接收服务器发送的事件(由Spring SSEEmitter发布(。它运行良好,但是,由于某种原因,我的服务器定期在新行中发布字符串"0"。发生这种情况时,WebClient将关闭连接。

我深入研究并打开Spring调试,发现了以下信息:

+--------------------...+
|  0  1  2  3  4  5  ... |
| 30 0d 0a 0d 0a     ...-|0....           |
[reactor.ipc.netty.http.client.HttpClientOperations:218] Received last HTTP packet
[reactor.ipc.netty.http.client.HttpClient:71] - USER_EVENT: [Handler Terminated]
[reactor.ipc.netty.channel.ChannelOperationsHandler:218] - Disposing context reactor.ipc.netty.channel.PooledClientContextHandler@45a97ad8
[reactor.ipc.netty.channel.PooledClientContextHandler:218] - Releasing channel: 
[reactor.ipc.netty.resources.DefaultPoolResources:218] - Released, now 0 active connections
[reactor.ipc.netty.http.client.HttpClient:71] - READ COMPLETE
[reactor.ipc.netty.http.client.HttpClient:71] - READ COMPLETE
[reactor.ipc.netty.http.client.HttpClient:71] - CLOSE
[reactor.ipc.netty.http.client.HttpClient:71] - INACTIVE
[reactor.ipc.netty.http.client.HttpClient:71] - UNREGISTERED

很明显,WebClient内部使用Netty HttpClient,该客户端将字符串"0"视为"lastHttpMessage",然后关闭连接。

我的问题:

  • 为什么Netty将"0"视为http连接的结束
  • 可以配置某事物来修改这种行为吗
  • WebClient只能使用Netty还是可以插入其他东西?到目前为止似乎不可能

您看到的"0"是HTTP规范的一部分-当服务器发送HTTP分块响应时,大小为0的分块表示响应已完成。

我不认为我们可以在Netty中配置任何东西来改变这一点,我也不认为我们应该这样做,因为这是HTTP的预期行为。

现在我想知道服务器为什么首先发送这个消息。可能是服务器上的Flux已到达其末尾,正在发送onComplete信号,从而终止响应。您的服务器实现中可能有某种东西完成了流。

您可以尝试通过在管道中添加logReactor操作符来查看哪个部分正在发送onComplete信号,从而了解服务器中发生了什么。如果你有一个代码片段要向我们展示,我认为你可以创建另一个问题,因为这个问题对Spring社区已经很有用了,让它变得更复杂并没有真正的帮助。

Spring Framework将使用WebClient支持其他客户端库,例如Jetty客户端(请参阅问题SPR-15092(。但我不认为使用另一个客户端会解决这个问题,因为它符合HTTP,而不是特定于客户端的行为。

我发现如果我使用"repeat",Flux将在连接完成后自动重新连接。含糖的

final Flux<Object> stream = WebClient
.create("http://localhost:8080/ssp")
.get().uri("/common/v1/eventstream")
.retrieve()
.bodyToFlux(ServerSentEvent.class)
.flatMap(e -> Mono.justOrEmpty(e.data()))
.repeat();
stream.subscribe(e -> System.out.println(e));

相关内容

  • 没有找到相关文章

最新更新