检测 Flux 数据结束 v.s。错误

Detecting end of Flux data v.s. error

目前正在使用 Angular 5 和 Spring 5 webflux 查看 SSE。基本应用程序工作正常,但在调查错误处理时我们注意到 angular 应用程序中的 EventSource 没有发现 spring 关闭连接由于到达Flux 数据流结束,并发生错误(例如,在传输中终止应用程序)。

我们调查的示例如下。

https://thepracticaldeveloper.com/2017/11/04/full-reactive-stack-ii-the-angularjs-client/

http://javasampleapproach.com/reactive-programming/angular-4-spring-webflux-spring-data-reactive-mongodb-example-full-reactive-angular-4-http-client-spring-boot-restapi-server#25_Service

EventSource 中的 onerror 和完成函数都会在 spring 成功发送数据并到达流的末尾时调用,然后关闭连接,或者当我们ctrl+c 应用中流,或者我们在发送数据的过程中随机抛出异常。

在所有 3 种情况下,EventSource 参数仅包含 {type: 'error'}

据我了解,SSE流主要是无限流;该规范似乎没有提供向客户端发送流结束信号的标准方式(默认情况下他们会尝试重新连接)。

您可以在您的控制器中实现它,方法是返回 Flux<ServerSentEvent> 并使用自定义事件终止通量:

return Flux.concat(
    fetchUserEvents(),
    Flux.just(ServerSentEvent.builder().event("disconnect").build()
);

在客户端,您可以在完成后正确关闭连接,将所有其他用例保留为错误并让浏览器自动重新连接:

evtSource.addEventListener("disconnect", function(e) {
    evtSource.close();
}, false);

这很烦人,所以我提出了 SPR-16761 以改进那里的 SSE 支持。