Я пытаюсь использовать функциональность 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 соответственно.
Заранее спасибо.