我正在尝试使用spring-webflux功能将一组数据流式传输到Angular 6客户端。一切正常,但有时服务器关闭连接而不发送所有所需的值。
我不确定这是webflux方面还是bug方面的错误,或者我的代码是否错误。如果有人可以在这里帮助我,那就太好了。还要添加代码片段,以更好地理解问题。
REST控制器
@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))));
}
在这里,我正在执行四个从DB获取计数并将其作为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运行前端和后端。
谢谢。