Spring Webflux генерирует IOException для SSE - PullRequest
0 голосов
/ 03 декабря 2018

Я пытался реализовать отправленные события сервера с помощью Spring Webflux (2.1.1.RELEASE) и использовать его в приложении JavaScript (Angular 7).

Проблема в том, что каждый раз, когда я использую метод .close () на EventSource на клиенте, он заставляет сервер выдавать:

Ошибка [java.io.IOException: Установленное соединениебыло прервано программным обеспечением на вашем хост-компьютере] для HTTP GET "/ price", но 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.interval(Duration.ofSeconds(1)).map(i -> randomPrice());

На стороне клиента я пытался использовать собственный EventSource и pollyfills, но все время с одним и тем же результатом.Вот вывод:

  • 2018-12-03 17: 29: 59.388 INFO 15080 --- [restartedMain] cmtsseserver.SseServerApplication: запуск SseServerApplication через 1,844 секунды (JVM работает для 2,874)
  • 2018-12-03 17: 30: 10.519 INFO 15080 --- [ctor-http-nio-2] реактор.Flux.OnAssembly.1: |onSubscribe ([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
  • 2018-12-03 17: 30: 10.519 INFO 15080 --- [ctor-http-nio-2] реактор. Флюкс.OnAssembly.1: |запрос (1)
  • 2018-12-03 17: 30: 11.522 ИНФО 15080 --- [параллель-1] реактор. Флюкс.onNext (Цена (валюта = EUR, курс = 30.314275239679823))
  • 2018-12-03 17: 30: 11.565 INFO 15080 --- [ctor-http-nio-2] реактор.Flux.OnAssembly.1: |request (31)
  • 2018-12-03 17: 30: 12.521 INFO 15080 --- [параллель-1] реактор. Флюкс.onNext (Цена (валюта = PLN, курс = 41.7888937560866))
  • 2018-12-03 17: 30: 13.521 INFO 15080 --- [параллель-1] реактор. Флюкс. OnSsembly.1: |onNext (Цена (валюта = CHF, курс = 89.64097216739523))
  • 2018-12-03 17: 30: 14.521 INFO 15080 --- [параллель-1] реактор.Flux.OnAssembly.1: |onNext (Цена (валюта = EUR, курс = 87.5498883139903))
  • 2018-12-03 17: 30: 15.521 INFO 15080 --- [параллель-1] реактор. Флюкс. Сборка.1: |onNext (Цена (валюта = PLN, курс = 28.019190555534855))
  • 2018-12-03 17: 30: 16.521 INFO 15080 --- [параллель-1] реактор.Flux.OnAssembly.1: |onNext (Цена (валюта = PLN, курс = 78.07885390201281))
  • 2018-12-03 17: 30: 17.522 INFO 15080 --- [параллель-1] реактор.Flux.OnAssembly.1: |onNext (Цена (валюта = EUR, курс = 95.44618060483998))
  • 2018-12-03 17: 30: 17.534 INFO 15080 --- [ctor-http-nio-2] реактор.Flux.OnAssembly.1: |cancel ()
  • 2018-12-03 17: 30: 17.549 ОШИБКА 15080 --- [ctor-http-nio-2] oswsadapter.HttpWebHandlerAdapter: [e24fb0e9] Ошибка [java.io.IOException: установленосоединение было прервано программным обеспечением на вашем хост-компьютере] для HTTP GET "/ price", но ServerHttpResponse уже зафиксировал (200 OK)

Несмотря на то, что программа, кажется, работает правильно, хотя мои журналы полныиз этих уродливых ошибок.Есть ли способ исправить это или хотя бы проглотить исключение?

1 Ответ

0 голосов
/ 04 декабря 2018

Это очень похоже на SPR-17257 .В этом случае мы получаем IOException, который трудно различить между уходящим клиентом и удаленным исключением, если вы передаете данные с другого сервера.

SPR-17341 попытается решить эту проблему в выпуске Spring Framework 5.2, который будет включен в Spring Boot 2.2.

...