其他分享
首页 > 其他分享> > Spring Web Flux反应服务器发送事件=无限循环?

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