context.become
의 경우를위한 좋은 사례입니다.
Akka 액터의 수신 블록이 PartialFunction[Any, Unit]
일 뿐이므로 다른 부분 기능으로 감쌀 수 있습니다. 이것은 Akka의 내장형 LoggingReceive과 동일한 접근법입니다.
class TimingReceive(r: Receive, totalTime: Long)(implicit ctx: ActorContext) extends Receive {
def isDefinedAt(o: Any): Boolean = {
r.isDefinedAt(o)
}
def apply(o: Any): Unit = {
val startTime = System.nanoTime
r(o)
val newTotal = totalTime + (System.nanoTime - startTime)
log.debug("Total time so far: " + totalTime + " nanoseconds")
ctx.become(new TimingReceive(r, newTotal))
}
}
object TimingReceive {
def apply(r: Receive)(implicit ctx: ActorContext): Receive = new TimingReceive(r, 0)
}
그런 다음 다음과 같이 사용할 수 있습니다 :
class FooActor extends Actor {
def receive = TimingReceive {
case x: String => println("got " + x)
}
}
을 각 메시지 후, 배우 지금까지 걸리는 시간을 기록합니다. 물론 변수를 사용하여 다른 작업을하고 싶다면이 작업을 수정해야합니다.
이 접근법은 배우가 실제로 살아있는 시간을 측정하지 않고 실제로 메시지를 처리하는 데 걸리는 시간 만 측정합니다. 수신 함수가 미래를 창출한다면 정확하지 않을 것입니다.