【问题标题】:Play Framework - balancing asynchronous and non-blockingPlay Framework - 平衡异步和非阻塞
【发布时间】:2017-09-10 05:18:53
【问题描述】:

我正在寻找一个灵光乍现的时刻,但还没有!将 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 中提取数据并在对我的服务的响应中返回它。建议表示赞赏。

【问题讨论】:

    标签: java asynchronous playframework playframework-2.0


    【解决方案1】:

    异步播放进程动作。因此,请随时从操作中返回 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"));
                            }
                    );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2015-08-03
      • 2012-01-15
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多