2017-04-13 1 views
0

Ich bin auf der Suche nach einer Glühbirne Moment, aber habe es noch nicht! Verwenden Sie Play Framework 2.5.9 mit Java 8 und versuchen Sie, bewährte Vorgehensweisen mit einem asynchronen, nicht blockierenden Modell zu befolgen.Play Framework - Balancing asynchron und non-blocking

Also meine Play-App macht einen REST-Service verfügbar. Eine GET-Anforderung an einen der Endpunkte gibt Daten an den Client zurück. Um einige dieser Daten abzurufen, muss mein REST-Dienst wiederum einen anderen Dienst aufrufen.

Indem ich den Aufruf an den anderen Dienst asynchron und nicht blockierend mache, kann ich die Daten in der Antwort von diesem Dienst in der Antwort auf meinen Dienst nicht aufnehmen.

Ich denke, ich möchte den Anruf von meinem Dienst an den anderen Dienst synchron aber nicht blockierend sein? Auf diese Weise wird der Thread, der die Anfrage in meinem Dienst bearbeitet, freigegeben, um etwas anderes zu tun, während ich auf eine Antwort von dem anderen Dienst warte. Und ich kann immer noch die Daten aus der Antwort in den anderen Dienst in die Antwort zu meinem Dienst aufnehmen. Ist das richtig?

Hier ist mein aktueller Code, die asynchron ist (was ich nicht will) und non-blocking (was ich will):

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")); 
        } 
      ); 

ich JsonResult will Daten aus JsonResult ziehen und es in der Rück Antwort auf meinen Service. Beratung geschätzt.

Antwort

2

Spielprozessaktion asynchron. Also zögern Sie nicht, CompletionStage<Result> von der Aktion zurückzugeben.

Sie müssen thenAccept-thenApply ändern und wickeln Sie Zeichenfolge führen new Date().toString() ... in eine Result:

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")); 
         } 
       ); 
}