2017-04-13 20 views
0

私は電球の瞬間を探していますが、まだ持っていません! Java 8と一緒にPlay Framework 2.5.9を使用し、非同期非ブロッキングモデルで優れたプラクティスを実行しようとしています。Play Framework - 非同期と非同期のバランスを取る

私のプレイアプリケーションはRESTサービスを公開しています。いずれかのエンドポイントへのGET要求は、クライアントにデータを返します。そのデータの一部を取得するために、私のRESTサービスは、別のサービスを呼び出す必要があります。

他のサービスの呼び出しを非同期で非ブロッキングにすることで、サービスへの応答でそのサービスからの応答にデータを含めることができません。

私のサービスから他のサービスへの呼び出しを同期しているが、非ブロックにしたいと思いますか?このようにして、私のサービスで要求を処理しているスレッドは、他のサービスからの応答を待つ間に何か他の処理を行うために解放されます。そして私はまだ私のサービスへの応答で他のサービスの応答からのデータを含めることができます。そうですか?ここで

は、非同期(私はしたくないもの)と、(私が対象となる)非ブロックである私の現在のコードです:

import play.libs.ws.WSClient; 
    import play.libs.ws.WSRequest; 
    import play.libs.ws.WSResponse; 

    //...........// 

    WSRequest request = ws.url(endpointUrl); 
    request.get() 
      .thenApply(WSResponse::asJson) 
      .thenAccept(
        jsonResult -> { 
         System.out.println(new Date().toString() + " "+ jsonResult.get("blah").get("bluh")); 
        } 
      ); 

私がするJsonResultがするJsonResultからデータを取得し、それを返したいです私のサービスへの応答。アドバイスありがとうございます。

答えて

2

プロセスアクションを非同期で再生します。だから、行動からCompletionStage<Result>を返すように気をつけてください。

あなたはthenApplythenAcceptを変更し、Resultにあなたは、文字列new Date().toString() ...を引き起こすラップする必要があります。

public CompletionStage<Result> apiData(){ 
     WSRequest request = ws.url(endpointUrl); 
     return request.get() 
       .thenApply(WSResponse::asJson) 
       .thenApply(
         jsonResult -> { 
          return ok(new Date().toString() + " "+ jsonResult.get("blah").get("bluh")); 
         } 
       ); 
} 
関連する問題