0

チャットを含むアプリケーションがあります。Node.JSのIOソケットを使用して、クライアントにプッシュします。クライアントは、認証されると、自分のIDを部屋の識別子として部屋に接続しています。クライアントのセッションとは関係なく、クライアントに通知をプッシュするシングルトンがいくつかあるため、これを行いました。チャットの春のBeanはSessionScopedです。私たちが直面している問題は、同じクライアントが2つの異なるブラウザを使用してシステムにログインしたときに発生します。2つのセッションが作成されるため、チャットの2つのSpringBeanが動作します。両方のBeanがユーザーIDで識別される部屋にプッシュするため、クライアント側では、同じメッセージが2回到着します。重複するメッセージの数は、ブラウザの数とともに増加します。

そこで、Springのカスタムスコープを作成したいと思います。このスコープは、同じログインでログインしているすべてのクライアント間で共有する必要があり、このログインでログインしているすべてのセッションが破棄されるとすぐに破棄する必要があります。

このスコープには、ログインごとにすべてのセッションを含むマップが必要であり、これらのセッションの破棄をリッスンする必要があると思います。誰かがこれを手伝ってくれますか?

4

1 に答える 1

0

次の解決策を見つけました。

MapMaker of Guava で Map を作成したSpringのsingleton Beanを作成しました。マップには弱い値があります (弱い参照についての詳細はこちら: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references)。次に、春のセッション Bean があります。このセッション Bean は、クライアントの ID を渡すチャットのインスタンスをシングルトンに要求します。シングルトン、マップに何かがあるかどうかを確認します。存在しない場合は、新しいチャット インスタンスを作成し、マップに配置して返します。セッション Bean は、このチャット インスタンスの参照を維持します。ユーザーが別のブラウザーでログインすると、新しいセッション Bean が同じことを行います。今回は、マップに保存されたインスタンスを取得します。チャット インスタンスへの参照を持つセッション Bean がなくなると、マップには弱い参照があるため、ガベージ コレクションが実行されます。

于 2013-03-12T13:13:46.613 に答える