阿卡:获得演员总数

时间:2014-12-12 14:39:05

标签: java akka

是否有一种简单的方法可以获得ActorSystem(使用Java8 API)的所有活动的总数?

对我来说调试我的应用程序会很有用:我在许多不同的地方创建Actors,并希望确保它们都能正确终止。当我运行我的应用程序数周时,演员儿童计数器将帮助我查看总数是否增加或保持大致相同。

2 个答案:

答案 0 :(得分:4)

您可以创建一个actor,它将Identify()消息发送给actor系统中的所有actor,然后计算回复。需要注意的是,在处理这些识别消息时,可以创建/删除参与者,并且某些参与者可能太忙而无法及时响应。因此,需要将计数视为近似值,这可能适合您的目的。下面是一些未经编译和未经测试的代码,但它应该给你一个想法:

    object CounterActor {
     case class CountRequest(requestId : String, timeout : Timeout)
     case class FinishCounting(requestId : String, originalSender : ActorRef)
     case class CountResponse(requestId : String, count : Int)
   }

    class CounterActor extends Actor {
      var counters = Map[String, Int]()

      def receive = {
        case CountRequest(requestId, timeout) => 
              counters = counters.updated(requestId, 0)
              system.actorSelection("/user/*") ! Identify(requestId)
              system.scheduler.scheduleOnce(timeout, FinishCounting(requestId, sender()), self) 

       case ActorIdentity(cId, ref) => 
             counters = counters.updated(cId, counters.getOrElse(cId, 0) + 1) 
             system.actorSelection(ref.path() / "*") ! Identify(cId)

       case FinishCounting(requestId, originalSender) =>
             originalSender ! CountResponse(requestId, counters.getOrElse(requestId, 0)) 
        } 
}

答案 1 :(得分:1)

您可以在The Guardian actor(children)上递归调用/user:并进行深度优先遍历以计算您的actor。这可能不准确,因为在执行此操作时可能已创建或删除了某些actor。在 stable 状态环境中,您应该获得准确的计数。

注意:我没有对此进行测试。