这是一个很好的使用案例context.become
。
请记住,比Akka actor中的接收块只是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)
}
}
每个消息后,演员将记录至今所花费的时间。当然,如果你想用这个变量做别的事情,你必须适应这个。
这种方法不会测量演员活着的时间,当然只是实际处理消息所花费的时间。如果您的接收功能创造未来,也不会是准确的。