1

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

我有一个非常基本的操作

public CompletionStage<Result> getPeople() { 

} 

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

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

dbMethod本身是异步的并返回CompletionStage>。

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

所以我的问题是,我不明白如何最好地编程Web服务,该方法不会阻止。

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

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

这个问题是,在“弄”法controllel块,还在于它抛出异常,我不知道如何处理比其他使用标准的try-catch块(这也使其非异步)。

我也尝试过这样的事情

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

但是,让编译错误。

我真的很感谢这里的一些帮助;因为我对Java异步编程非常陌生,尽管阅读了很多教程,但我不清楚如何最好地使用这些教程。

谢谢大家。

+0

您在使用播放2.5.X?使用'supplyAsync'时编译错误是什么? – Anton

回答

1

你应该回到你的未来,但结果转变为play.mvc.result:

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