2017-09-05 19 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送信イベント=無限ループですか?

は私の春のWeb反応コントローラです:

var source = new EventSource('http://localhost:8080/test'); 
source.addEventListener('message', function(e) { 
    console.log(e.data); 
}, false); 

倍の角度リターンは4つのイベント無限の数、また春がMongoDBのを照会し続けていくつかの理由:ここで

@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; 
} 

は私の角度のコードです。私は、Server Sent Eventsのアプローチでは、Springはすべてのイベントを返し、新しいイベントを待っているはずですが、代わりにAngularはより多くのイベントを要求し続けているように見えます。

ブラウザでhttp://localhost:8080/testにヒットした場合、予想どおり4つのイベントしか返されません。

私には何が欠けているか説明してください。ありがとう。

答えて

2

ここに私の最高の推測では、ということです:ブラウザは、すべての4つのエントリが取得されたリポジトリクエリ

  • はかつて、Fluxがリポジトリ
  • によって完成されたトリガSSEストリームに接続し

    1. これはブラウザがバックステップ番号1
    2. にSSE源
    3. に自動的に再接続SSEストリーム
    4. を完了する

    ブラウザのブラウザのdevtools(ネットワークタブ)に再接続する必要があります。

    無限のストリームを探している場合は、the Tailable Cursors feature in Spring Data MongoDBを使用してください。あなたのケースでは、@Tailableでリポジトリメソッドに注釈を付けるだけで、そのトリックを行う必要があります。

    +0

    迅速な対応をありがとう!あなたは絶対に正しいです。無限のストリームの代わりに無限のリダイレクトでした。私はReactiveドライバを持つMongoDBが自動的に接続を閉じることを認識しませんでした。そして、あなたが '@Tailable'を追加すると、そのトリックができたと言いました。しかし何らかの理由で私は反対の問題があります。 SpringはSSEを1回だけ返します。別のブラウザ/タブで同じエンドポイントにヒットした場合、何も送信されません。コンソールでは、SpringがMongoDBからイベントを受け取ったが、ブラウザにそれらをフラッシュしないことがわかります。アプリの再起動も役に立ちません。別のエンドポイントに再マップすると、もう一度動作します。私はブラウザのキャッシュを疑う –

    +0

    Flux(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#share--)に付属の共有メソッドを使用することを検討してください。複数の接続が行われた場合、db接続のオーバーロードが終了します。 –

    関連する問題