2014-01-26 54 views
0

我有一套Akka Actor,我给他们中的每一个人提供几百条消息。我想跟踪该Actor的每个实例处理所收到的所有消息的时间。我现在做的是在Actor实例中拥有一个状态:Akka Actors记录处理时间

var startTime 
var firstCall 

我首先调用Actor实例时设置了两个变量。有没有另外一种方法可以用来跟踪我的Actor实例的处理时间?我想避免在我的Actor实例中拥有本地状态。

回答

4

这是一个很好的使用案例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) 
    } 
} 

每个消息后,演员将记录至今所花费的时间。当然,如果你想用这个变量做别的事情,你必须适应这个。

这种方法不会测量演员活着的时间,当然只是实际处理消息所花费的时间。如果您的接收功能创造未来,也不会是准确的。