アクションコンポジションは仕事をするのに十分ではありませんが、アクションコンポジション+フューチャー、またはアクションコンポジション+アクターはこれを達成するための良い方法です。
アクション構成+未来
応答を生成し、非同期コンテキストでロギング/処理を起動し、並行して結果を送信します。
def LoggedAction(f: Request[AnyContent] => Result) = Action { request =>
val result = f(request)
concurrent.future(myLogAction(request, result))
result
}
アクション構成+俳優
それを達成するためのよりクリーンな方法です。前の場合と同様に、応答を生成し、ロギング/処理イベントをアクターに送信し、並行して結果を送信します。
import play.api._
import play.api.mvc._
import play.libs._
import akka.actor._
object Application extends Controller with Finally {
def index = LoggedAction { r =>
Ok(views.html.index("Your new application is ready."))
}
}
trait Finally {
self: Controller =>
lazy val logActor = Akka.system.actorOf(Props(new LogActor), name = "logActor")
def LoggedAction(f: Request[AnyContent] => Result) = Action { request =>
val result = f(request) // Generate response
logActor ! LogRequest(request) // Send log event to LogActor
println("-> now send page to client")
result
}
case class LogRequest(request: Request[AnyContent])
class LogActor extends Actor {
def receive = {
case LogRequest(req) => {
println(req.host)
// ....
}
}
}
}
// Console
-> now send page to client
127.0.0.1:9000