注: 次の内容は Play! 2.1.x. 遊ぶため!2.0.4 nico_ekito の回答を参照してください。
クライアントとのやり取りは、次の図に要約できます。
Play の HTTP ハンドラー ( Nettyの上に構築されたもの) は、独自の実行コンテキスト内に存在します。conf/routes
リクエストを受信すると、URL に従って (アプリケーションのファイルを使用して) 呼び出すアプリケーションのエントリ ポイントを見つけようとします。この時点で、HTTP 要求のヘッダーのみがメモリに読み込まれます。
次に、エントリポイントが呼び出されます。通常はactionで、残りの body があればそれをロードします。これは、別の実行コンテキストである Play! conf/application.conf
「ユーザー」実行コンテキスト。アプリケーションのファイルで構成できる Akka アクター ディスパッチャーとして定義されます。
最後に、アクション内で非同期呼び出しを実行できます (例: Web サービスを呼び出す)。これらの非同期呼び出しはすべて Scala のFuture API を使用するため、呼び出しサイトのスコープで利用可能な実行コンテキストを使用します。だからあなたはプレイを使うことができます!「ユーザー」実行コンテキスト (で定義play.api.libs.concurrent.Execution.defaultContext
)。
要約すると、プレイ!次のタスクに個別の実行コンテキストを使用します。
- リクエストを受け取る (Netty HTTP ハンドラー) ;
- アクションを呼び出します (「ユーザー」実行コンテキスト)。
また、非同期計算に必要な実行コンテキストを自由に使用できます (Play! の「ユーザー」実行コンテキストを含む)。
すべてのユーザー コードがデフォルトで Play! 「ユーザー」実行コンテキスト。ブロックすると、それ以上ユーザー コードを実行できなくなりますが、他のすべての操作は続行できます。
膨大な計算を行う場合は、専用の実行コンテキストを使用することをお勧めします。