Spring Reactive:java.io.IOException:当我关闭连接时,已建立的连接被主机中的软件中止

时间:2018-04-22 14:48:44

标签: java spring reactive-programming spring-webflux

使用spring反应应用程序,我创建了一个每秒产生一个事件的休息服务。我的休息控制器的代码是:

@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Event> getEvents() {
    Flux<Event> eventFlux = Flux.fromStream(Stream.generate(() -> new Event(new Random().nextLong(), "Hello Event")));
    Flux<Long> emmitFlux = Flux.interval(Duration.ofSeconds(1));
    return Flux.zip(eventFlux, emmitFlux).map(Tuple2::getT1);
}

应用程序在浏览器中的url:localhost:8080 / events运行正常。我每秒钟都会举办一次新活动。但是当我关闭浏览器时,我收到以下错误:

java.io.IOException: An established connection was aborted by the software in your host machine

有没有人面对并解决任何与弹簧反应相似的问题?

1 个答案:

答案 0 :(得分:2)

您会看到此消息,因为Spring WebFlux没有正确的方法来区分常规SSE流取消以及因网络连接问题而导致的意外连接关闭。

我们甚至过滤了一些典型的消息,比如“破管”,但我猜你是在Windows上,异常消息是本地化的,所以我们不能以可靠的方式做到这一点。

作为SPR-16688的一部分,从Spring Framework 5.0.6 / Spring Boot 2.0.2开始,我们已经改进了这种用例的日志记录,以使其更具相关性:

  • Reactor Netty除了抛出错误外,不会记录错误 例外情况,请参阅reactor-netty#339
  • WebFlux服务器现在使用警告错误日志级别而不是错误
  • 只在日志中打印消息,而不是在反应世界中无用的堆栈跟踪