Spring Web Flux Reactive + Server Sent Events = 无限循环?
Spring Web Flux Reactive + Server Sent Events = infinite loop?
我正在使用 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;
}
这是我的 Angular 代码:
var source = new EventSource('http://localhost:8080/test');
source.addEventListener('message', function(e) {
console.log(e.data);
}, false);
出于某种原因Angular returns 4 事件无限次,而且Spring 一直在查询MongoDB。我的理解是,使用服务器发送事件方法 Spring 应该 return 它拥有的所有事件并继续等待新事件,但看起来 Angular 一直在请求越来越多的事件。
如果我在浏览器中点击 http://localhost:8080/test,它 return 只有预期的 4 个事件。
你能解释一下我遗漏了什么吗?谢谢
我最好的猜测是:
- 浏览器连接到 SSE 流,触发存储库查询
- 检索到所有 4 个条目后,
Flux
由存储库完成
- 这完成了 SSE 流
- 浏览器自动重新连接到 SSE 源
- 返回第 1 步
您应该会在浏览器开发工具(网络选项卡)中看到浏览器正在重新连接。
如果您正在寻找无限流,您应该使用 the Tailable Cursors feature in Spring Data MongoDB。在你的情况下,只需用 @Tailable
注释你的存储库方法就可以了。
我正在使用 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;
}
这是我的 Angular 代码:
var source = new EventSource('http://localhost:8080/test');
source.addEventListener('message', function(e) {
console.log(e.data);
}, false);
出于某种原因Angular returns 4 事件无限次,而且Spring 一直在查询MongoDB。我的理解是,使用服务器发送事件方法 Spring 应该 return 它拥有的所有事件并继续等待新事件,但看起来 Angular 一直在请求越来越多的事件。
如果我在浏览器中点击 http://localhost:8080/test,它 return 只有预期的 4 个事件。
你能解释一下我遗漏了什么吗?谢谢
我最好的猜测是:
- 浏览器连接到 SSE 流,触发存储库查询
- 检索到所有 4 个条目后,
Flux
由存储库完成 - 这完成了 SSE 流
- 浏览器自动重新连接到 SSE 源
- 返回第 1 步
您应该会在浏览器开发工具(网络选项卡)中看到浏览器正在重新连接。
如果您正在寻找无限流,您应该使用 the Tailable Cursors feature in Spring Data MongoDB。在你的情况下,只需用 @Tailable
注释你的存储库方法就可以了。