问题:Spring Web Flux Reactive + 服务器发送事件 u003d 无限循环?

我正在使用 Spring Web Flux Reactive、MongoDB 和 Angular 构建实时事件流应用程序(例如股票价格)。我想构建以下管道:MongoDB -> Reactive MongoDB Driver -> Spring Web Reactive MongoDB Repository -> Spring Web Reactive Controller -> Angular(通过服务器发送事件)。

这是我的 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;
}

这是我的角度代码:

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 个事件,如预期的那样。

你能解释一下我错过了什么吗?谢谢。

解答

我最好的猜测是:

1.浏览器连接SSE流,触发repository查询

2.一旦所有4个条目都被检索到,Flux由存储库完成

  1. 这样就完成了 SSE 流

  2. 浏览器自动重新连接到 SSE 源

  3. 回到第 1 步

您应该在浏览器开发工具(网络选项卡)中看到浏览器重新连接。

如果您正在寻找无限流,您应该使用Spring Data MongoDB中的 Tailable Cursors 功能。在您的情况下,只需使用@Tailable注释您的存储库方法就可以了。

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐