ActorSystem의 모든 살아있는 배우 (Java8 API 사용)의 총 수를 쉽게 얻을 수있는 방법이 있습니까?Akka : 총 배우 수를 얻으십시오
내 응용 프로그램을 디버깅하는 데 유용 할 것입니다. 여러 곳에서 액터를 만들고 모두 올바르게 종료하고 싶습니다. 배우 아동 카운터는 내가 몇 주 동안 신청서를 실행할 때 총 숫자가 올라가거나 거의 동일하게 유지되는지 확인하도록 도와줍니다.
ActorSystem의 모든 살아있는 배우 (Java8 API 사용)의 총 수를 쉽게 얻을 수있는 방법이 있습니까?Akka : 총 배우 수를 얻으십시오
내 응용 프로그램을 디버깅하는 데 유용 할 것입니다. 여러 곳에서 액터를 만들고 모두 올바르게 종료하고 싶습니다. 배우 아동 카운터는 내가 몇 주 동안 신청서를 실행할 때 총 숫자가 올라가거나 거의 동일하게 유지되는지 확인하도록 도와줍니다.
액터 시스템의 모든 액터에게 Identify() 메시지를 보내고 응답을 계산할 액터를 생성 할 수 있습니다. 주의해야 할 점은 이러한 Identify 메시지가 처리되는 동안 액터가 생성/삭제 될 수 있으며 일부 액터는 너무 바빠서 응답 할 수 없다는 것입니다. 그래서 계산은 근사치로 처리해야합니다. 이는 아마도 귀하의 목적에 맞을 것입니다. 아래는 컴파일되지 않은 및 테스트되지 않은 코드이지만 당신에게 아이디어를 제공해야합니다 : 액터의 수를 얻을 수있는 깊이 우선 탐색을
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))
}
}
당신은 재귀 가디언 배우 (/user:
)에 children
를 호출 할 수 있습니다 및 않습니다. 이 작업이 진행되는 동안 일부 액터가 생성되거나 제거되었을 수 있으므로 정확하지 않을 수 있습니다. 상태가 지속되는 상태 환경에서는 정확한 개수를 얻어야합니다.
참고 : 테스트하지 않았습니다.
나에게 합리적인 소리. 하지만 어떻게 ActorRef에서 아이들을 얻을 수 있습니까? – Sonson123
다른 모든 액터가 시작시 "여기에 있습니다"메시지를 게시하는 분산 채널에서 수신하는 단일 카운터 액터가 시나리오에 적합한 옵션일까요? –
당신의 제안에 감사드립니다. 그러나 나는 많은 일이 될 수있는 카운터를 줄이기 위해 많은 다른 장소에서 제작 된 모든 배우들을 감독해야 할 것입니다. – Sonson123
귀하의 의견을 오해하지 않는 한, 귀하는 자신의 신생 기업의 "여기에 계신"메시지를받는 순간 너무나 많은 일을하지 않고서도 그들을 위해 죽음의 시계를 등록 할 수 있다고 생각합니다. –