Использование CompletionStage для возврата результатов

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

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

public CompletionStage<Result> getPeople() {

}

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

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

Сам dbMethod является асинхронным и возвращает CompletionStage>.

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

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

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

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, и, несмотря на то, что я прочитал много руководств, я не понимаю, как лучше всего их использовать.

Спасибо вам всем.


comment
Вы используете Play 2.5.x? Какая ошибка компиляции при использовании supplyAsync?   -  person Anton    schedule 24.04.2016


Ответы (1)


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

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