Я пытался реализовать отправленные события сервера с помощью 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)
Несмотря на то, что программа, кажется, работает правильно, хотя мои журналы полныиз этих уродливых ошибок.Есть ли способ исправить это или хотя бы проглотить исключение?