私はチャットのようなサービスを作成しています。jettyの他のスレッドからのwebsocketメッセージのブロードキャスト
ユーザがページを開くと、websocketエンドポイントに接続し、着信メッセージを待ちます。
サーバー側では、jettyを使用するJavaアプリケーションが接続を待機しています。ユーザーがメッセージを送信するたびに、メッセージはすべてのクライアントにブロードキャストされます。別のスレッドから時々送信されるシステムメッセージもあります。
問題は、このソリューションのスレッドの安全性が本当に心配です。私が理解するところでは、jettyはxワーカースレッドでスレッドプールを使用するので、複数の接続が複数のスレッドによって処理される可能性があります。私のシステムメッセージサービスは、jettyスレッドプールの外でも、別のスレッドでも実行されます。
ブロードキャスト機能は、ほとんどの場合、この(汎用関数名)のように見えるように起こっている:
for(Connection connection : server.getWebSocketConnections())
connection.sendMessage(message);
それを呼び出したスレッドに応じて:
- getWebSocketConnectionsによって返されたコレクションが中に変更することができます繰り返し。
- 接続がすでにクローズさ/のsendMessage
- を行うとき
いくつかの内部バッファの競合状態などがある場合があります配置された/削除されたことがありそこで質問です:
安全にメッセージをブロードキャストする方法桟橋を使用して外部スレッドからすべてのWebSocket接続を開きますか?