当前位置: 首页 > 知识库问答 >
问题:

WebClient停止读取流量时的异常

林夕
2023-03-14

我创建了一个返回无限流量的服务器和一个异步读取响应对象的客户机。我想让客户机退订通量并停止处理它。

@GetMapping(path = "/infinite", produces = TEXT_EVENT_STREAM_VALUE)
public Flux<String> getStreamOfLongs() {
    return Flux.generate(sink -> sink.next("x"));
}
WebClient client = WebClient.create("http://localhost:8080");
    Flux<String> flux = client.get()
            .uri("/infinite")
            .accept(TEXT_EVENT_STREAM)
            .retrieve()
            .bodyToFlux(String.class);
    Disposable disposable = flux.subscribe(consumer);
    Executors.newSingleThreadScheduledExecutor().schedule(() -> disposable.dispose(), 5, TimeUnit.SECONDS);

当客户端取消订阅(使用Disposable.Dispose())时,在服务器端抛出2个异常(IOException和UnsupportedOperationException):

后接

2017-11-24 01:04:09.476错误83663---[ctor-http-nio-2]O.S.W.S.Adapter.HttpWebHandlerAdapter:无法处理请求

共有1个答案

殳经略
2023-03-14

据我所知你做得对。

Disposable::Dispose有效地取消流,当您对接收数据不再感兴趣时,从订阅者的角度来看,应该这样做。

webclient端调用该命令将导致关闭HTTP连接。我不认为有一种“更干净”的方式告诉服务器你不想再接收数据了。对于HTTP/2,情况可能有所不同,因为可以关闭HTTP流而不关闭整个连接。

  1. 服务器尝试写入时连接已关闭
  2. 未正确处理响应(服务器仍有内容要写)

如果您对这种行为有增强的想法,请在https://jira.spring.io上创建一个票证

 类似资料:
  • 如何使用WebClient读取长达x秒的流,然后返回检索到的项?

  • 我想改变我的代码为单一订户。现在我有了 这段代码工作正常,reduce方法非常简单。我试着为单个订户更改代码 这是我的代码,这个代码不起作用。没有错误,没有结果。调试后,我发现代码卡在第二个平面地图上,当我减少流。我认为问题是平面地图合并,卡在单声道解决方案上。有些人现在如何解决这个问题,只使用单个订户? 如何复制,您可以使用另一个类或创建一个类。小尺寸的正在工作,而大尺寸的正在消亡 这种方法是即

  • 问题内容: 我正在做学校运动,我不知道该怎么做。就我所读的内容而言,扫描仪并不是最好的方法,但是由于老师仅使用扫描仪,因此必须使用扫描仪来完成。 这就是问题。用户将文本输入到数组。该数组最多可以增加10行,并且用户输入以空行结尾。 我已经做到了: 但这不能正常工作,我无法弄清楚。理想情况下,如果用户输入: 然后按回车键,温打印它应该给的数组: 你能帮助我吗? 问题答案: 这将从您的输入中读取两行:

  • 我正在运行一个Spring Boot应用程序,它使用WebClient处理非阻塞和阻塞HTTP请求。应用程序运行一段时间后,所有传出的HTTP请求似乎都被卡住了。 WebClient用于向多个主机发送请求,但作为示例,以下是它如何初始化并用于向Telegram发送请求: WebClientConfig: 所有WebClient都使用相同的ReactorClientHttpConnector。 电报

  • 我正在尝试使用TkinterGUI使用python/tweepy来流式传输推文。理想情况下,我会有一个启动流的“开始”按钮和一个停止流的“停止”按钮。下一个示例(来自stackoverflow)以一种简化的方式展示了我试图实现的目标: 我试图将此应用到我的代码中,开始按钮工作正常,完成了它应该做的所有事情,但停止按钮没有做任何事情。窗口没有冻结或任何东西,只是停止按钮没有效果。由于什么事也没有发生

  • 我有一条处理hl7消息的骆驼路线。处理成功后,我希望将其传递给另一个endpointb以进行进一步处理。 但是如果在processHL7中发生任何异常,我有一个catch块来做一些处理。当我进入doCatch并遇到end时,我想停止处理,但这并没有发生。无论发生什么,流都将到达endpointb。当我进入doCatch块时,如何停止?