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

@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


是否有人面对并解决了弹簧反应性的任何类似问题?

最佳答案

您会看到此消息,因为Spring WebFlux没有适当的方法来区分常规SSE流取消与由于网络连接问题引起的意外连接关闭。

我们甚至可以过滤一些典型的消息,例如“断线”,但我想您在Windows上,并且异常消息已本地化,因此我们无法以可靠的方式执行此操作。

话说回来,作为SPR-16688的一部分(将从Spring Framework 5.0.6 / Spring Boot 2.0.2开始提供),我们改进了此类用例的日志记录,以使其更加相关:


除了抛出异常,Reactor Netty不会记录错误。
例外,请参见reactor-netty#339
WebFlux服务器现在使用警告错误日志级别而不是错误
仅消息被打印在日志中,而不是堆栈跟踪,这在响应世界中通常是无用的

09-10 08:33
查看更多