4

JavaEE サーバーとして GF 4 を使用しています。

これが私がサーブレット処理を理解する方法です。スレッドのプールがあり、リクエストが来ると、このプールから1つのスレッドがリクエストを処理するために取られます。その後、スレッドはプールに戻されます。

上記の情報に基づいて、websocket (サーバーエンドポイント) は次のように処理されると思います (よくわかりません): スレッドのプールがあります。

  • クライアントは新しい WebSocket を作成し、プールからスレッドを取得して ServerEndpoint の新しいインスタンスを作成し、@OnOpen メソッドを実行します。その後、スレッドはプールに戻されます。
  • クライアントは、WebSocket を介してサーバーにメッセージを送信します。@OnMessage メソッドを実行するためにプールからスレッドが取得されます。その後、スレッドはプールに戻されます。
  • クライアントが websocket を閉じます - @OnClose メソッドを実行するためにプールからスレッドが取得されます。その後、スレッドはプールに戻されます。

つまり、ServerEndpoint のすべてのメソッドを異なるスレッドで実行できるということです。私の理解は正しいですか?

4

1 に答える 1

5

はい。

インスタンスは、関連付けられている WebSocket セッションが引数ServerEndpointとして利用できる限り存続します。その WebSocket セッション中に、多くの HTTP および WebSocket リクエストが発生する可能性があります。このような各リクエストは、個別のスレッドとして扱われます。Session@OnOpen

つまり、ServerEndpoint何らかの理由でクラスが複数のメソッドでインスタンス変数を処理する必要がある場合は、スレッド セーフな方法で実装する必要があります。具体的な機能要件によっては、Session#getUserProperties()代わりに を使用して、WS セッションに関連付けられた状態を保持することをお勧めします (セッション属性と考えてください)。

これはすべて、使用されているコンテナーと WS 実装に関係ないことに注意してください。

于 2016-07-05T09:00:12.560 に答える