使用 CompletionStage 获得 return 个结果

Using CompletionStage to return results

我是玩框架的新手Java8。我正在尝试在 Play 中编写一个简单的 Web 服务,它符合异步模型并允许 Web 服务快速调用 return,为异步线程留下繁重的工作。

我有一个很基础的操作

public CompletionStage<Result> getPeople() {

}

调用中的真正处理必须从数据库加载人员数据。数据库方法是

List<People> people = dbService.getPeople();
return ok(Json.tojson(people));

dbMethod 本身是异步的并且 returns CompletionStage>.

CompletionStage<List<People>> getPeople() {}

所以我的问题是我无法理解如何最好地将 Web 服务编程为该方法不会阻塞。

我可以在我的处理程序中做这样的事情

public CompletionStage<Result> getPeople() {
  CompletableFuture.completedFuture(
    ok(Json.toJson(dbservice.getPeople().get())));
}

这个问题是控制器在 "get" 方法中阻塞,而且它抛出异常,我不知道如何处理,除了使用标准的 try-catch 块(这也使它非异步)。

我也试过类似的方法

return CompletableFuture.supplyAsync(() -> {
    return dbService.getPeople();
    }).thenApply(i -> { ok(Json.toJson(i.get())); } );

但这会导致编译错误。

非常感谢您的帮助;因为我是 Java 异步编程的新手,尽管阅读了很多教程,但我不清楚如何最好地使用它们。

谢谢大家

你应该 return 你的未来,但将结果转换为 play.mvc.result:

public CompletionStage<Result> getPeople() {
    return dbService.getPeople().thenApply(peopleList -> 
        ok(Json.toJson(peopleList))
    );
}