【问题标题】:Spring Webflux throws IOException for SSESpring Webflux 为 SSE 抛出 IOException
【发布时间】:2018-12-03 16:49:07
【问题描述】:

我一直在尝试使用 Spring Webflux (2.1.1.RELEASE) 实现服务器发送事件并在 JavaScript 应用程序 (Angular 7) 中使用它。

问题是,每当我在客户端的 EventSource 上使用 .close() 方法时,它都会使服务器抛出:

HTTP GET "/price" 的错误 [java.io.IOException: 已建立的连接被主机中的软件中止],但 ServerHttpResponse 已提交 (200 OK)

代码非常简单:

@RestController("/price")
public class PriceController {

private final PriceProvider priceProvider;

public PriceController (PriceProvider priceProvider) {
    this.priceProvider = priceProvider;
}


@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Price> randomPrices () {
    return priceProvider.getPrices().log();
}

}

Flux 创建如下:

Flux.interval(Duration.ofSeconds(1)).map(i -> randomPrice());

在客户端,我尝试使用本机 EventSource 和 pollyfills,但结果始终相同。这是输出:

  • 2018-12-03 17:29:59.388 INFO 15080 --- [restartedMain] c.m.t.sseserver.SseServerApplication:在 1.844 秒内启动 SseServerApplication(JVM 运行 2.874)
  • 2018-12-03 17:30:10.519 信息 15080 --- [ctor-http-nio-2] reactor.Flux.OnAssembly.1:| onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
  • 2018-12-03 17:30:10.519 信息 15080 --- [ctor-http-nio-2] reactor.Flux.OnAssembly.1:|请求(1)
  • 2018-12-03 17:30:11.522 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=欧元,汇率=30.314275239679823))
  • 2018-12-03 17:30:11.565 信息 15080 --- [ctor-http-nio-2] reactor.Flux.OnAssembly.1:|请求(31)
  • 2018-12-03 17:30:12.521 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=PLN,汇率=41.7888937560866))
  • 2018-12-03 17:30:13.521 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=瑞士法郎,汇率=89.64097216739523))
  • 2018-12-03 17:30:14.521 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=欧元,汇率=87.5498883139903))
  • 2018-12-03 17:30:15.521 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=PLN, rate=28.019190555534855))
  • 2018-12-03 17:30:16.521 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=PLN, rate=78.07885390201281))
  • 2018-12-03 17:30:17.522 信息 15080 --- [parallel-1] reactor.Flux.OnAssembly.1:| onNext(价格(货币=欧元,汇率=95.44618060483998))
  • 2018-12-03 17:30:17.534 信息 15080 --- [ctor-http-nio-2] reactor.Flux.OnAssembly.1:|取消()
  • 2018-12-03 17:30:17.549 错误 15080 --- [ctor-http-nio-2] os.s.w.s.adapter.HttpWebHandlerAdapter:[e24fb0e9] 错误 [java.io.IOException:已建立的连接被主机中的软件] 用于 HTTP GET "/price",但 ServerHttpResponse 已提交 (200 OK)

尽管程序似乎运行正常,但我的日志中充满了这些丑陋的错误。有什么办法可以修复它或至少吞下异常?

【问题讨论】:

    标签: spring netty server-sent-events spring-webflux reactive


    【解决方案1】:

    这看起来很像SPR-17257。在这种情况下,我们会收到一个IOException,如果您从另一台服务器流式传输数据,则很难区分客户端离开和远程异常。

    SPR-17341 将尝试在 Spring Framework 5.2 版本中解决该问题,并包含在 Spring Boot 2.2 中。

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 2021-08-23
      • 2021-03-05
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多