フレームワークとJava8をプレイするのは初めてです。Asynch モデルに準拠し、Web サービスの呼び出しが迅速に返されるようにする単純な Web サービスを Play で作成しようとしています。
私は非常に基本的な操作をしています
public CompletionStage<Result> getPeople() {
}
呼び出しの実際の処理では、データベースから個人データをロードする必要があります。デブメソッドは
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())));
}
これの問題は、controllerが「get」メソッドでブロックし、標準のtry-catchブロックを使用する以外に処理方法がわからない例外をスローすることです(これにより、非同期にもなります)。
私もこのようなことを試しました
return CompletableFuture.supplyAsync(() -> {
return dbService.getPeople();
}).thenApply(i -> { ok(Json.toJson(i.get())); } );
しかし、それはコンパイルエラーを引き起こします。
ここで助けていただければ幸いです。私はJava非同期プログラミングに非常に慣れていないため、多くのチュートリアルを読んだにもかかわらず、これらを最適に使用する方法が不明です.
皆さん、ありがとうございました。