1

Я новичок в игре framework и Java8. Я пытаюсь написать простой веб-сервис в Play, который соответствует модели Asynch и позволяет быстро вернуться к веб-сервису, оставив тяжелую работу для асинхронного потока.Использование CompletionStage для возврата результатов

У меня есть очень простая операция

public CompletionStage<Result> getPeople() { 

} 

Реальная обработка в вызове должна загружать данные из базы данных лиц,. Метод db равен

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

dbMethod сам по себе async и возвращает CompletionStage>.

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

Таким образом, моя проблема в том, что я не понимаю, как лучше всего программировать веб-службу, чтобы метод не блокировал.

я могу сделать что-то подобное в моем обработчике

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

вы используете Play 2.5.x? Что такое ошибка компиляции при использовании 'supplyAsync'? – Anton

ответ

1

Вы должны вернуть свое будущее, но преобразовать результат в play.mvc.result:

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