我正在使用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个事件。
你可以解释一下我错过了什么吗?感谢。答案 0 :(得分:4)
我最好的猜测是:
Flux
由存储库您应该会在浏览器devtools(网络标签)中看到浏览器重新连接。
如果您正在寻找无限流,则应使用the Tailable Cursors feature in Spring Data MongoDB。在您的情况下,只需使用@Tailable
注释您的存储库方法即可。