我正在使用Spring Web Flux Reactive,MongoDB和Angular構建實時事件流應用程序(例如股票價格)。我想構建以下管道:MongoDB - > Reactive MongoDB Driver - > Spring Web Reactive MongoDB Repository - > Spring Web Reactive Controller - > Angular(通過Server Sent Events)。Spring Web Flux Reactive + Server發送的事件=無限循環?
這裏是我的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);
出於某種原因角收益乘以4級的事件無限多的,也春季不斷查詢的MongoDB。我的理解是,使用Server Sent Events方法,Spring應該返回它所有的事件並不斷等待新事件,但是看起來像Angular一直在不停地詢問越來越多的事件。
如果我在瀏覽器中點擊http://localhost:8080/test,它將只返回4個預期的事件。
請問你能解釋一下我失蹤了嗎?謝謝。
感謝您的快速響應!你絕對正確,它是無限重定向而不是無限流。我沒有意識到MongoDB的Reactive驅動會自動關閉連接。正如你所說的那樣,加入@ Tailable製造了這個伎倆。但由於某種原因,我有一個相反的問題。 Spring只返回一次SSE。如果我在不同的瀏覽器/標籤頁中選擇相同的端點,則不會發送任何內容在控制檯中,我看到Spring從MongoDB獲取了事件,但沒有將它們刷新到瀏覽器。應用程序重新啓動也沒有幫助。如果我重新映射到另一個端點,它將再次運行一次。我懷疑瀏覽器緩存 –
請考慮使用Flux附帶的共享方法(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#share--)。如果建立了多個連接,則最終會超載您的數據庫連接。 –