Соединение закрывается преждевременно, не выдавая все нужные значения при использовании Spring WebFlux - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь использовать функциональность spring-webflux для потоковой передачи набора данных на мой клиент Angular 6. Все работает отлично, за исключением того, что иногда сервер закрывает соединение, не отправляя все нужные значения.

Я не уверен, является ли это ошибкой со стороны webflux или угловой стороны, или мой код неверен. Было бы здорово, если бы кто-нибудь мог помочь мне здесь. Добавление фрагмента кода также для лучшего понимания проблемы.

REST Controller

@GetMapping(value = "/getStatsReactively", produces = "text/event-stream")
public Flux<StatResponse> getStatsReactively() {
    Date inputDate = new Date();
    Map<String, SingleArgReturnFunction<Date, Map<String, Long>>> providers = new HashMap<>();
    providers.put("success", input -> transactionService.getSuccessCountPerHour(input));
    providers.put("error", input -> transactionService.getErrorCountPerHour(input));
    providers.put("txn", input -> transactionService.getTransactionsPerHour(input));
    providers.put("pfshare", input -> transactionService.getPlatformWiseShare(input));

    return Flux.fromStream(providers.entrySet().stream()
            .map(entry -> new StatResponse(entry.getKey(), entry.getValue().run(inputDate))));
}

Здесь я выполняю четыре операции, которые получают данные из БД и передают их как объект Flux<T>.

угловой абонент

getStatsReactively(): Observable<StatResponse> {
    return Observable.create((observer) => {

        var eventSource = new EventSourcePolyfill(this.URL, {
            headers: {
              'Authorization': 'Bearer '+this.authHeader
            }
        });
        eventSource.onmessage = (event) => {
            console.debug('Received event: ', event);
            let json = JSON.parse(event.data);
            observer.next(new StatResponse(json['type'], json['counts']));
        };
        eventSource.onerror = (error) => {
            if (eventSource.readyState === 0) {
                console.log('The stream has been closed by the server.');
                eventSource.close();
                observer.complete();
            } else {
                observer.error('EventSource error: ' + error);
            }
        }
    });
}

Здесь клиент вызывает контроллер REST и получает счет от SSE. Но иногда клиент получает только 2 счета, иногда 4, а иногда вообще ничего. И странно то, что в этом нет закономерности.

NB : - Я использую EventSourcePolyfill, поскольку собственный источник событий не позволяет мне добавлять заголовки.

Примечания к стороне : - Я запускаю как переднюю, так и внутреннюю часть на моей локальной машине с NodsJS и Tomcat8 соответственно.

Заранее спасибо.

...