检测 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/
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 支持。
目前正在使用 Angular 5 和 Spring 5 webflux 查看 SSE。基本应用程序工作正常,但在调查错误处理时我们注意到 angular 应用程序中的 EventSource
没有发现 spring 关闭连接由于到达Flux 数据流结束,并发生错误(例如,在传输中终止应用程序)。
我们调查的示例如下。
https://thepracticaldeveloper.com/2017/11/04/full-reactive-stack-ii-the-angularjs-client/
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 支持。