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)) 
    ); 
}