2017-04-13 17 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")); 
         } 
       ); 
}