2014-12-12 3 views
3

ActorSystem의 모든 살아있는 배우 (Java8 API 사용)의 총 수를 쉽게 얻을 수있는 방법이 있습니까?Akka : 총 배우 수를 얻으십시오

내 응용 프로그램을 디버깅하는 데 유용 할 것입니다. 여러 곳에서 액터를 만들고 모두 올바르게 종료하고 싶습니다. 배우 아동 카운터는 내가 몇 주 동안 신청서를 실행할 때 총 숫자가 올라가거나 거의 동일하게 유지되는지 확인하도록 도와줍니다.

+0

다른 모든 액터가 시작시 "여기에 있습니다"메시지를 게시하는 분산 채널에서 수신하는 단일 카운터 액터가 시나리오에 적합한 옵션일까요? –

+0

당신의 제안에 감사드립니다. 그러나 나는 많은 일이 될 수있는 카운터를 줄이기 위해 많은 다른 장소에서 제작 된 모든 배우들을 감독해야 할 것입니다. – Sonson123

+1

귀하의 의견을 오해하지 않는 한, 귀하는 자신의 신생 기업의 "여기에 계신"메시지를받는 순간 너무나 많은 일을하지 않고서도 그들을 위해 죽음의 시계를 등록 할 수 있다고 생각합니다. –

답변

3

액터 시스템의 모든 액터에게 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)) 
     } 
} 
+0

나는 접근법과 코드를 좋아한다. :) 그러나 이것은'grand/... '아이들이 아닌'/ user /'의 직접적인 배우들만을 제공 할 것이다. – Sonson123

+1

맞습니다. 재귀 적이 아닙니다. 그러나 쉽게 고칠 수 있습니다. 나는 나의 대답을 업데이트했다. –

+0

좋아, 지금은 나를 위해 (약간의 수정과 함께 컴파일 된 코드를 얻을) 작동합니다. 올바른 타임 아웃을 설정하는 것은 어렵지만 디버깅 목적에 완벽하고 배우를 변경하지 않고 작동합니다. – Sonson123

1

당신은 재귀 가디언 배우 (/user:)에 children를 호출 할 수 있습니다 및 않습니다. 이 작업이 진행되는 동안 일부 액터가 생성되거나 제거되었을 수 있으므로 정확하지 않을 수 있습니다. 상태가 지속되는 상태 환경에서는 정확한 개수를 얻어야합니다.

참고 : 테스트하지 않았습니다.

+0

나에게 합리적인 소리. 하지만 어떻게 ActorRef에서 아이들을 얻을 수 있습니까? – Sonson123

관련 문제