目前正在使用Angular 5和Spring 5 webflux查看SSE。基本应用程序工作正常,但在调查错误处理时我们注意到角度应用程序中的EventSource
没有看到弹簧关闭连接因为到达Flux结束时有任何区别数据流和发生的错误(例如,在转移过程中终止应用程序)。
我们根据调查得出的例子如下:
https://thepracticaldeveloper.com/2017/11/04/full-reactive-stack-ii-the-angularjs-client/
EventSource
中的onerror和completion函数都会在Spring成功发送数据并到达流的末尾然后关闭连接或者我们 ctrl + c 应用程序中间流,或者当我们在发送数据的过程中随机抛出异常时。
在所有3个案例中,EventSource
参数只包含{type: 'error'}
。
答案 0 :(得分:1)
据我所知,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支持。