2017-07-04 5 views
0

静的URLにマッピングするチャットがあります。私はユーザーのための部屋を作る機会を得る必要があります。WebSocket注釈への注入変数@ServerEndpoint( "/ myVar")

注釈に変数を挿入する方法@ServerEndpoint("/myVariable")アプリが既に実行中の場合

class SomeClass{ 
    public void createRoom(User user) { 
     String name = user.getName(); 
     //...Somehow inject name to annotation @ServerEndpoint("/name")... 
    } 
} 

@ServerEndpoint("/chat") //May be replace to @ServerEndpoint(someGetteUserName()) 
public class ChatEndpoint { 
    @OnMessage 
    public void message(String message, Session client) 
      throws IOException, EncodeException { 

     for (Session peer : client.getOpenSessions()) { 
      peer.getBasicRemote().sendText(message); 
     } 
    } 
} 

私はSpringを使用していません。これは、明確なwebsocketとGlassfishです。

アノテーションへのインプリメンテーション変数の注入を作成するのを手伝ってください。ありがとうございました。

答えて

1

私は、チャットルームの作成と操作をしたいと思っているのであれば、何も注入する必要はないと思います。エンドポイントとは独立してJavaコードでこれを処理するだけです。

私はあなたをお勧めします。@ServerEndpoint("/chat"/{client_id}):1つのWebSocketサーバーのエンドポイントを作成します

  • 。このクライアントID pathParamは、セッションIDとして機能します。
  • ChatEndpointクラスでは、部屋のリストを初期化します(このリストはすべてのスレッド間でstatic < =>共通である必要があります)。
  • クライアントとルームを処理するためのビジネスメソッドを作成します(ユーザーの作成/削除、作成/削除、部屋の予約など)。
  • 最後に、チャットメッセージで、ルームの宛先を指定してみてください。これは、JSON形式を使用すると非常に簡単です。

メッセージ= {...、 "部屋": "ROOM1"、...}

+0

は答えをいただき、ありがとうございます。私は '@ServerEndpoint("/chat "/ {client_id})の' '{{client_id}'の部分を除いてすべてのことを意味していますか?これはユーザーまたはパスの一部からの要求のparamですか?あなたは ''/chat/'{client_id}'のパスは ''/chat ''ですが、それはbreacket' {client_id} 'の構文ですか?どのようにクライアント側でこのparamを挿入し、私のChatEndpointクラスに入るのですか? – Pavel

+0

メッセージを特定の受信者にプッシュするときに役立つIDによってクライアントセッションを特定することは、単なる提案です。たとえば、最初のセッションAは、他のセッションBに直接メッセージを送信したい(Bとのプライベートチャット)。ここで(https://stackoverflow.com/a/21572502/3834429)いくつかの便利なソースコード(フロント&バック):) –

+0

この方法は、クライアントが彼女のIDを知っていることを主張するか? – Pavel