2014-01-26 123 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) 
    } 
} 

每個消息後,演員將記錄至今所花費的時間。當然,如果你想用這個變量做別的事情,你必須適應這個。

這種方法不會測量演員活着的時間,當然只是實際處理消息所花費的時間。如果您的接收功能創造未來,也不會是準確的。