2016-11-21 7 views
0

私は次の問題に直面していますが、まだ解決策が見つかりませんでした。Java Websocket/MessageHandlerがグローバルスコープに戻りますか?

  • UI部(1)
  • バックエンド・アプリケーション(2)
  • "クラウド内" microservice(3)
: Iは、互いに通信する必要がある3つの異なる用途を有します

バックエンドアプリケーションは、UI用のWebサービス(REST)を提供して、マイクロサービスとの間で情報を取得し、マイクロサービスに情報を入力します。 マイクロサービスから取得したいものはすべて正常に動作しますが、 データをマイクロサービスに入れる場合、仕様にはWebSocket接続が必要です。これは、あまりにもうまく動作しますが、microserviceは今

{"statusCode":200,"messageId":"1234567890"} 

問題のように、(未)に成功し、コマンドの後にメッセージを返している:私は自分のアプリケーションでこのメッセージを取得し、UIに戻ってそれを送ることができますどのように、ユーザーはコマンドが成功したかどうかを知ることができますか?私はこれを試したときのために

WebSocketClient.java

@OnMessage 
public void onMessage(Session session, String msg) { 
    if (this.messageHandler != null) { 
     this.messageHandler.handleMessage(msg); 
    } 
} 
public void addMessageHandler(MessageHandler msgHandler) { 
    this.messageHandler = msgHandler; 
} 
public static interface MessageHandler { 

    public String handleMessage(String message); 
} 

MyTotalAwesomeController.java

public class MyTotalAwesomeController { 

    WebSocketClient wsc = new WebSocketClient(); 
    ... 


    @RequestMapping(value="/add", method={RequestMethod.POST, RequestMethod.OPTIONS}) 
    public ResponseEntity<Object> putDataToMicroservice(@RequestBody Map<String, Object> payload, @RequestHeader(value = "authorization") String authorizationHeader) throws Exception { 
    ... 

    wsc.addMessageHandler(new WebSocketClient.MessageHandler() { 
     public String handleMessage(String message) { 

      System.out.println("RETURN MSG FROM WSS : " + message); 
      return message; 
     } 
    }); 

    return ResponseEntity.ok("worked"); 
} 

私は、MessageHandlerのリターンからのコンソール出力を見ることができます私はretの親メソッドにこれをどのように渡すことができるのか分かりませんurnはちょうどResponseEntity.ok()を返すinsted。私はとてもとても私を判断しないでください、まだJavaでのWebSocketの接続に使用されていないよ

;-)

はあなたの助けをいただき、ありがとうございます。

+0

コントローラにはinitメソッドがありますか? – nandsito

+0

'@ PostContruct'アノテーション付きです。 – sebastian

答えて

1

以下のコードは、@OnMessageメソッドがWebSocketクライアントランタイムによって管理されるスレッドで実行されることを前提として動作します。 @OnMessageメソッドを実行しているスレッドを調べてください。

グローバルスコープ内のスレッドによって実行されるputDataToMicroservice()メソッドは、WebSocketレスポンスがWSクライアントスレッドに到着するまで待機します。これにより、メッセージがグローバルスコープスレッドに再送信されます。その後、コントローラクラスの実行が継続されます。

public class MyTotalAwesomeController { 

    WebSocketClient wsc = new WebSocketClient(); 

    // Queue for communication between threads. 
    private BlockingQueue<String> queue; 

    @PostConstruct 
    void init() { 

     queue = new SynchronousQueue<>(true); 

     // This callback will be invoked by the WebSocket thread. 
     wsc.addMessageHandler(new WebSocketClient.MessageHandler() { 
      @Override 
      public String handleMessage(String message) { 
       System.out.println("RETURN MSG FROM WSS : " + message); 
       // Pass message to the controller thread. 
       queue.put(message); 
       // Note that the return value is not necessary. 
       // You can take it out of the interface as well. 
       return null; 
      } 
     }); 
    } 

    @RequestMapping(value="/add", method={RequestMethod.POST, RequestMethod.OPTIONS}) 
    public ResponseEntity<Object> putDataToMicroservice(@RequestBody Map<String, Object> payload, @RequestHeader(value = "authorization") String authorizationHeader) throws Exception { 

     // At this point you make a WebSocket request, is that right? 
     doWebSocketRequest(); 

     // This poll call will block the current thread 
     // until the WebSocket server responds, 
     // or gives up waiting after the specified timeout. 
     // 
     // When the WebSocket server delivers a response, 
     // the WS client implementation will execute the 
     // @OnMessage annotated method in a thread 
     // managed by the WS client itself. 
     // 
     // The @OnMessage method will pass the message 
     // to this thread in the queue below. 

     String message = queue.poll(30, TimeUnit.SECONDS); 

     if (message == null) { 
      // WebSocket timeout. 
     } 

     return ResponseEntity.ok("worked"); 
    } 
} 
+0

もう少し説明できますか?更新された回答を待っています。 – sebastian

+0

@sebastian今問題をよく理解しました。以前考えたよりも少し複雑です。スレッドの同期が必要になります。 websocketの実装としてtyrusを使用していますか? – nandsito

+0

いいえ、私はちょうどjavax.websocket。*を使用しています。マイクロサービスは私によって開発されていないので、私はサーバ側で何が使用されているのかを定義することはできません。 – sebastian

関連する問題