Play 2 では、スレッドをブロックしない AsyncResult を介して非同期 Web サービス呼び出しを行うことができます。
public static Result feedTitle(String feedUrl) {
return async(
WS.url(feedUrl).get().map(
new Function<WS.Response, Result>() {
public Result apply(WS.Response response) {
return ok("Feed title:" + response.asJson().findPath("title"));
}
}
)
);
}
これは、WS 呼び出しの結果をユーザーに直接渡すなどの単純なことを行っている場合にのみ機能します。ただし、結果に対して追加の操作を行う必要がある場合はどうでしょうか。
documentationを見ると、これができるようです:
Promise<Response> promise = WS.url("http://some.website.com").get();
Response response = promise.get(); // I've got the result, but I've also blocked
これは明らかに理想的ではありません。Play が実行を他のスレッドに渡すことを許可しながら、非同期呼び出しを行う方法はありますか?