私は、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つのイベントしか返されません。
私には何が欠けているか説明してください。ありがとう。
迅速な対応をありがとう!あなたは絶対に正しいです。無限のストリームの代わりに無限のリダイレクトでした。私はReactiveドライバを持つMongoDBが自動的に接続を閉じることを認識しませんでした。そして、あなたが '@Tailable'を追加すると、そのトリックができたと言いました。しかし何らかの理由で私は反対の問題があります。 SpringはSSEを1回だけ返します。別のブラウザ/タブで同じエンドポイントにヒットした場合、何も送信されません。コンソールでは、SpringがMongoDBからイベントを受け取ったが、ブラウザにそれらをフラッシュしないことがわかります。アプリの再起動も役に立ちません。別のエンドポイントに再マップすると、もう一度動作します。私はブラウザのキャッシュを疑う –
Flux(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#share--)に付属の共有メソッドを使用することを検討してください。複数の接続が行われた場合、db接続のオーバーロードが終了します。 –