通常、DBへのSQLコールの実行は、通常、順次ブロックされ、順番に実行されます。 Playは、アプリのパフォーマンスを向上させる非同期実行を強力にサポートしています。プレイ2.0
public static Result slow() {
Logger.debug("slow started");
// Start execution
Promise<DataObject> userObject1 = SlowQuery.getUser(440);
Promise<DataObject> userObject2 = SlowQuery.getCategory(420);
// ... here execution is already in progress ...
// Map to Promise Objects
Promise<DataObject> res1 = userObject1.map(new Function<DataObject, DataObject>() {
public DataObject apply(DataObject res) {
Logger.debug("Got result (userObject1): " + res.toString());
return res;
}
});
Promise<DataObject> res2 = userObject2.map(new Function<DataObject, DataObject>() {
public DataObject apply(DataObject res) {
Logger.debug("Got result (userObject2): " + res.toString());
return res;
}
});
// here we wait for completion - this blocks
userObject1.getWrappedPromise().await();
userObject2.getWrappedPromise().await();
// the result is available
Logger.debug(res1.get().toString());
Logger.debug(res2.get().toString());
Logger.debug("slow finished");
return ok("done");
}
のためのサンプルコードを作業する
は、コミュニティのwiki機能を使用して改善して自由に感じる - 私はいくつかの部分を短縮することができると確信しています。
ありがとうございました。私は仕事がどのように非ブロッキングであるかを理解しているかどうか分からない。私のMySQLクライアントがブロックしている場合は、ジョブ内でそれを使用することはまだブロックされていますか?または、Playは新しいジョブが作成されるたびに新しいスレッドを作成しますか?そのような場合、非同期フレームワークの全目的を破ることになります。 – Continuation
@Continuation「非同期フレームワーク」と「非同期操作が可能なフレームワーク」をPlayに関して混乱させるかもしれないと思います!フレームワーク?リンクされたドキュメントで説明されているように、ジョブを使用して、HTTP要求からノンブロッキングから他の受信HTTP要求まで非同期的に長時間実行される操作を実行できます。 – tmbrggmn