2014-01-26 3 views
0

저는 Akka 액터 세트를 보유하고 있으며 각 액터에 대해 약 수백 개의 메시지를 제공합니다. 그 액터의 각 인스턴스가받은 모든 메시지를 처리하는 데 걸린 시간을 추적하고 싶습니다. 액터 인스턴스가 처음 호출 될 때 나는 변수를 모두 설정Akka 액터 로깅 처리 시간

var startTime 
var firstCall 

: 내가 현재하고 있어요로 배우 인스턴스 상태를하는 것입니다. Actor 인스턴스의 처리 시간을 추적하는 데 사용할 수있는 또 다른 방법이 있습니까? 내 액터 인스턴스에 로컬 상태가되는 것을 피하고 싶습니다.

답변

4

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) 
    } 
} 

을 각 메시지 후, 배우 지금까지 걸리는 시간을 기록합니다. 물론 변수를 사용하여 다른 작업을하고 싶다면이 작업을 수정해야합니다.

이 접근법은 배우가 실제로 살아있는 시간을 측정하지 않고 실제로 메시지를 처리하는 데 걸리는 시간 만 측정합니다. 수신 함수가 미래를 창출한다면 정확하지 않을 것입니다.

관련 문제