2017-01-23 2 views
0

내 프로그램의 두 번째 호출이 예기치 않은 동작을하는 문제가 있습니다.원격 Akka Actor System 종료

나는 akka-remoting 응용 프로그램을 정상적으로 종료하려고합니다.

저는 두 개의 액터 시스템, 로컬 액터 시스템과 원격 액터 시스템을 가지고 있습니다.

  1. 두 배우, 원격
  2. 의 로컬 시스템에, 하나를 만들어 지역 배우 시스템은 내가 먼저 원격 배우 체제를 시작하고 실행 다운

자신을 종료 지방 배우 시스템.

처음 실행하면 모든 것이 정상이며 로컬 액터 시스템이 종료됩니다 (리모컨이 여전히 켜져 있음). 그러나 두 번째로 (원격 시스템을 다시 시작하지 않고) 이것을 실행하면 동작이 달라지고 두 개의 액터 시스템이 심장 박동을 시작합니다. 로컬이 종료되지 않습니다.

동작을 복제 할 수있는 최소한의 코드는 아래

현지 배우 시스템입니다

object ActorAsSink_7 extends App { 
    val system = ActorSystem("system") 
    val localActor = system.actorOf(MyActor_4.props) 
    val remoteActor = system.actorOf(MyActor_4.props, "remote_agent") 
    localActor ! PoisonPill 
} 

원격 배우 시스템

object RemoteActorSystem extends App { 

    import system.dispatcher 
    implicit val system = ActorSystem("remote-actorsystem") 

    // actors in this actor system are created remotely 

    println("hello.. remote agent is up") 

} 

이 훨씬 더 큰 코드의 일부입니다 기지, 그리고 이것은 내가 찾을 수있는 최소한의 것입니다 repl 문제를 제기하십시오.

로컬 액터 시스템이 다르게 작동하고 두 번째 호출에서 종료되지 않는 이유는 무엇입니까?

현지 배우 다음

object MyActor_4 { 
    val props = Props[MyActor_4] 
} 

class MyActor_4 extends Actor with ActorLogging { 
    def receive = { case x: Any => log.error("unexpected message in reaper: " + x) } 
    override def postStop = { println ("shutting down...") ; context.system.terminate(); } 
} 

원격가 잘 작동하지만,이 종료 문제에 대한됩니다 않습니다.

답변

0

아래 코드에서 나는 remoteActor를 멈추지 않을 것이다.

localActor ! PoisonPill 

왜냐하면 PoisonPill이 보낸 사람 액터와 모든 하위 액터를 중지시키기 때문입니다. 여기에서 remoteActor는 localActor의 하위 액터가 아닙니다. 로컬 액터 시스템의 두 액터가 처음 실행되는 지점에서 로그를 공유 할 수 있습니까?

+0

ActorSystem을 종료하려면 다음과 같이하면됩니다. 'system.shutdown' ActorSystem'system.actorSelection ("/ user/*")을 중지하지 않고 localActor 및 remoteActor를 중지하려면! PoisonPill' 자세한 내용을 확인하실 수 있습니다 http://stackoverflow.com/questions/9356986/stop-all-actors-in-a-system-without-shutting-down-the-system-itself – Advika

관련 문제