2

フレームワークと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非同期プログラミングに非常に慣れていないため、多くのチュートリアルを読んだにもかかわらず、これらを最適に使用する方法が不明です.

皆さん、ありがとうございました。

4

1 に答える 1

3

future を返す必要がありますが、結果を play.mvc.result に変換する必要があります。

public CompletionStage<Result> getPeople() {
    return dbService.getPeople().thenApply(peopleList -> 
        ok(Json.toJson(peopleList))
    );
}
于 2016-06-08T08:27:50.583 に答える