Spring Web Flux反应服务器发送事件=无限循环?
作者:互联网
我正在使用Spring Web Flux Reactive,MongoDB和Angular构建实时事件流应用程序(例如股票价格).我想建立以下管道:MongoDB->反应性MongoDB驱动程序-> Spring Web Reactive MongoDB存储库-> Spring Web反应控制器->角度(通过服务器发送事件).
这是我的Spring Web反应控制器:
@GetMapping(value = "/test", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<LiveRate> test() {
Flux<LiveRate> res = liveRateRepository.findByLastUpdate(1504580678).log(); // I query hard-coded value and MongoDB returns 4 events
return res;
}
这是我的Angular代码:
var source = new EventSource('http://localhost:8080/test');
source.addEventListener('message', function(e) {
console.log(e.data);
}, false);
由于某些原因,Angular会无限次返回4个事件,因此Spring也会继续查询MongoDB.我的理解是,使用服务器发送事件方法,Spring应该返回它拥有的所有事件并继续等待新的事件,但是看起来Angular一直在请求越来越多的事件.
如果我在浏览器中命中了http://localhost:8080/test,则它仅返回4个预期的事件.
您能解释一下我所缺少的吗?谢谢.
解决方法:
我最好的猜测是:
>浏览器连接到SSE流,这触发存储库查询
>一旦检索到所有4个条目,存储库就会完成Flux
>这样就完成了SSE流
>浏览器自动重新连接到SSE源
>返回步骤1
您应该在浏览器devtools(网络选项卡)中看到浏览器重新连接.
如果要查找无限流,则应使用the Tailable Cursors feature in Spring Data MongoDB.在这种情况下,只需使用@Tailable注释存储库方法即可.
标签:spring-webflux,server-sent-events,angular,mongodb,spring 来源: https://codeday.me/bug/20191025/1930765.html