2017-09-05 196 views
1

我正在使用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個預期的事件。

請問你能解釋一下我失蹤了嗎?謝謝。

回答

2

我這裏最好的猜測是:

  1. 的瀏覽器連接到SSE流,從而觸發存儲庫查詢
  2. 一旦所有4項已經被檢索,該Flux由庫完成
  3. 這樣就完成了SSE流
  4. 瀏覽器自動重新連接到SSE源
  5. 回到步驟數1

您應該看到瀏覽器在您的瀏覽器devtools(網絡選項卡)中重新連接。

如果您要查找無限流,請使用the Tailable Cursors feature in Spring Data MongoDB。在你的情況下,只需用@Tailable註釋你的存儲庫方法應該可以做到。

+0

感謝您的快速響應!你絕對正確,它是無限重定向而不是無限流。我沒有意識到MongoDB的Reactive驅動會自動關閉連接。正如你所說的那樣,加入@ Tailable製造了這個伎倆。但由於某種原因,我有一個相反的問題。 Spring只返回一次SSE。如果我在不同的瀏覽器/標籤頁中選擇相同的端點,則不會發送任何內容在控制檯中,我看到Spring從MongoDB獲取了事件,但沒有將它們刷新到瀏覽器。應用程序重新啓動也沒有幫助。如果我重新映射到另一個端點,它將再次運行一次。我懷疑瀏覽器緩存 –

+0

請考慮使用Flux附帶的共享方法(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#share--)。如果建立了多個連接,則最終會超載您的數據庫連接。 –