我正在寻找一个灯泡时刻,但尚未拥有它!将Play Framework 2.5.9与Java 8一起使用,并尝试使用异步,非阻塞模型进行良好实践。
所以我的播放应用程序公开了一个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中提取数据并将其返回给我的服务响应。建议表示赞赏。
答案 0 :(得分:2)
异步播放流程操作。因此,请随意从动作中返回CompletionStage<Result>
。
您需要将thenAccept
更改为thenApply
并将结果字符串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"));
}
);
}