2017-04-13 15 views
0

我正在尋找一個燈泡的時刻,但還沒有它!在Java 8中使用Play Framework 2.5.9,並嘗試使用異步,非阻塞模型遵循良好的實踐。玩框架 - 平衡異步和非阻塞

所以我的遊戲應用程序公開了一個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>

您需要更改thenAcceptthenApply,敷你結果字符串new Date().toString() ...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")); 
         } 
       ); 
}