是否有一种简单的方法可以获得ActorSystem(使用Java8 API)的所有活动的总数?
对我来说调试我的应用程序会很有用:我在许多不同的地方创建Actors,并希望确保它们都能正确终止。当我运行我的应用程序数周时,演员儿童计数器将帮助我查看总数是否增加或保持大致相同。
答案 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 状态环境中,您应该获得准确的计数。
注意:我没有对此进行测试。