使用Spring WebFlux时,连接过早关闭而没有发出所有所需的值

时间:2018-10-30 07:44:37

标签: angular spring-boot spring-webflux

我正在尝试使用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运行前端和后端。

谢谢。

0 个答案:

没有答案