从java中的CompletionStage获取价值

时间:2016-08-12 17:58:13

标签: java java-8 promise

我在java 8中使用play2.5。我正在使用

向服务器发出POST请求
WSRequest request = ws.url("http://abababa .com");
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx")
            .setHeader("Content-Type", "application/x-www-form-urlencoded")
CompletionStage<WSResponse> responsePromise = complexRequest.post("grant_type=password"
            + "&username=xxxxx&password=yyyyy");
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson);

如何打印响应的最终响应。我想返回部分响应此函数。与同步代码相比,调用此函数的函数是否也有不同的代码?

3 个答案:

答案 0 :(得分:11)

jsonPromise.toCompletableFuture().get()

答案 1 :(得分:2)

问题是所有这些代码都是异步执行的。如果你确实想从结果中返回结果,则必须先阻塞,直到得到结果。阻塞效果不佳,因为它会影响性能。通常,您希望按原样返回CompletionStage,并让调用者决定如何处理它。但是,如果您必须绝对返回结果,则示例代码如下所示。

WSRequest request = ws.url("http://abababa .com");
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx")
        .setHeader("Content-Type", "application/x-www-form-urlencoded")
CompletionStage<WSResponse> responsePromise =    complexRequest.post("grant_type=password"
        + "&username=xxxxx&password=yyyyy");
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson);
Object waitGuard = new Object();
AtomicReference<JsonNode> resultReference = new AtomicReference();
synchronized(waitGuard){
  jsonPromise.thenAccept( jsonNode -> {
  resultReference.set(jsonNode);
  waitGuard.notify();
  });
  waitGuard.wait();
}
return resultReference.get();

答案 2 :(得分:1)

JsonNode jsonData = jsonPromise.toCompletableFuture().get()

我尝试了上面的代码但是我得到编译器错误,返回JsonNode数据,然后我用

JsonNode jsonData = jsonPromise.toCompletableFuture().join()

并且工作正常