2014-04-22 5 views
2

내 akka 응용 프로그램에 redis-react-nb 라이브러리를 사용하고 있습니다. 불행하게도, 레디 스에 연결이 끊어 도서관이 내 응용 프로그램과 같이 종료 통지를 수신합니다 context stop selfAkka - 종료 처리 방법

자체를 중지합니다 :

def receive: Actor.Receive = { 
      case Terminated(actorRef) => 
      ... 
     } 

을 그래서 내가 여기 어떻게 해야할지 궁금하네요. 원칙적으로 모든 자식 액터를 다시 시작하여 새로운 레디 연결로 초기화합니다. 기본적으로 액터 시스템을 초기 상태로 재설정합니다.

개념적으로 뭔가가 빠졌습니까? 아니면 배우가 예외를받지 않고 자식을 모두 다시 시작하는 방법이 있습니까? self ! RestartAll 또는 이와 비슷한 제품입니까?

+0

자식마다 재발견 연결을 열거 나 연결을 유지하고 모든 자식 행위자로부터 메시지를받을 배우 1 명을 가질 계획입니까? – Nimrod007

답변

2

이 보는 또 다른 방법은 당신이 얘기하는 배우가 레디 스 배우에 의존한다는 말을하는 것입니다, 그것이없이 작업을 계속할 수 없습니다. 이 경우 해당 오류를 상위로 전달하여 다시 시작하도록하는 것이 적절합니다. 종료 된 메시지를 처리하지 않으면 DeathPactException이 발생하지만 해당 자식에 대한 기본값이 자식을 종료하기 때문에 부모에 적절한 supervisorStrategy를 설치해야합니다. 종료 메시지를 받으면 정의하고 RedisFailedException을 던지는 것이 좋습니다.

0

가능한 해결책 중 하나는 SupervisorStrategy.Restart의 구현을 살펴 보는 것입니다. 불행하게도 구현은 InternalActorRef는 사용

final def restartChild(child: ActorRef, cause: Throwable, suspendFirst: Boolean): Unit = { 
    val c = child.asInstanceOf[InternalActorRef] 
    if (suspendFirst) c.suspend() 
    c.restart(cause) 
    } 

그래서 내가 거기에는 내장 된 솔루션은 없다 당신은 스스로를해야 가정합니다.

def receive = { 
    case Terminated(actorRef) => self ! RestartAll 
    case RestartAll => 
     context.children.foreach(_ ! PoisonPill) 
     //start all necessary actors again 
    }