2016-06-22 1 views
0

나는 두 배우, 부모와 자녀가 있습니다. 부모는 content.watch (child)를 사용하여 자식을 감시합니다. 자식이 context.stop (self)를 호출하면 부모는 Terminated 메시지를받습니다. 그러나 자식이 예외를 throw하면 akka가 다시 시작하지만 부모에게 Terminated 메시지를 보내지 않습니다.Akka deathwatch - 종료 및 재시작 시청하기

class Parent ... { 
    def receive = { 
    case "start" => 
     val child = ... 
     context.watch(child) 
     child ! "throw" 
    case Terminated(actor) => logger.error(s"$actor died"") 
    } 
} 

class Child ... { 
    def receive = { 
    case "stop" => context.stop(self) // parent is notified 
    case "throw" => throw new Exception("oops") // parent is not notified 
    } 
} 

어떻게 부모 액터가 자식을 모니터링하고 종료/재시작을 볼 수 있습니까?

class Parent ... { 
    override val supervisorStrategy = OneForOneStrategy() { 
    case _: Exception => Stop 
    } 
} 

I는이 배우의 모든 아이들에게 적용됩니다 그것을 이해로서 : 내가 생각 해낸

하나의 옵션은 예외에 중단 부모의 감독 전략을 무시하는 것입니다. 이상적으로는 개인의 아이들 (배우의 종류)에 대해 다른 수퍼바이저 전략을 가지고 싶습니다 그래서 나는

class Child ... { 
    override def postRestart(reason: Throwable): Unit = context.stop(self) 
} 

I에게 작품을 사용하는 것으로 생각하지만 해킹의 비트처럼 보인다. 내가 모르는 다른 옵션이 있습니까?

감사합니다.

답변

0

나는 배우 형 감독 모델에 따라 어떤 알고,하지만 마음에 오는 것은 당신이 아역 배우에서 예외를 catch하고 봉투로 포장 할 수 있다는 것입니다하지 않습니다

try { 
    ... 
} catch { 
    case e: Throwable => throw new DontRestartMeException(e) 
} 

또는 더 쉽게 수동으로 예외를 던지면 래핑 된 태그를 직접 throw하면됩니다.

그리고 부모에 예외 유형에 따라 결정 :

override val supervisorStrategy = OneForOneStrategy() { 
    case e: DontRestartMeException => Stop 
    case _: Exception => Restart 
} 
+0

감사합니다, 나는이 아이디어를 살펴 보겠습니다 –

관련 문제