Play Framework - 平衡异步和非阻塞

时间:2017-04-13 23:30:30

标签: java asynchronous playframework playframework-2.0

我正在寻找一个灯泡时刻,但尚未拥有它!将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中提取数据并将其返回给我的服务响应。建议表示赞赏。

1 个答案:

答案 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"));
                        }
                );
}
相关问题