Spring Web Flux Reactive + Server Sent Events =无限循环?

时间:2017-09-05 15:49:37

标签: spring mongodb angular server-sent-events spring-webflux

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

这是我的Spring Web Reactive Controller:

@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个事件。

你可以解释一下我错过了什么吗?感谢。

1 个答案:

答案 0 :(得分:4)

我最好的猜测是:

  1. 浏览器连接到SSE流,触发存储库查询
  2. 一旦检索到所有4个条目,Flux由存储库
  3. 完成
  4. 这样就完成了SSE流
  5. 浏览器自动重新连接到SSE源
  6. 回到第1步
  7. 您应该会在浏览器devtools(网络标签)中看到浏览器重新连接。

    如果您正在寻找无限流,则应使用the Tailable Cursors feature in Spring Data MongoDB。在您的情况下,只需使用@Tailable注释您的存储库方法即可。