使用CompletionStage返回结果

时间:2016-04-22 08:37:20

标签: lambda playframework-2.0 java.util.concurrent concurrent.futures completable-future

我是玩框架和Java8的新手。我试图在Play中编写一个简单的Web服务,它符合Asynch模型并允许Web服务调用快速返回,为异步线程留下了沉重的负担。

我有一个非常基本的操作

public CompletionStage<Result> getPeople() {

}

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

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

dbMethod本身就是异步并返回CompletionStage&gt;。

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

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

我可以在我的处理程序中执行类似的操作

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

问题在于,控制器会在&#34; get&#34;方法,并且它抛出异常,除了使用标准的try-catch块之外我不知道如何处理(这也使它成为非异步)。

我也试过这样的事情

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

但这会导致编译错误。

我真的很感激这里的一些帮助;因为我是Java异步编程的新手,尽管阅读了很多教程,但我还不清楚如何最好地使用它们。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

您应该返回您的未来,但将结果转换为play.mvc.result:

lv.addFooterView(pro)