终止远程Akka演员系统

时间:2017-01-23 04:20:02

标签: akka actor

我遇到了问题,我的程序的第二次调用会产生不可预测的行为。

我正在努力确保正常关闭akka-remoting应用程序。

我有两个演员系统,一个本地演员系统和一个远程演员系统。

本地演员系统

  1. 创建两个actor,一个在本地系统上,一个在远程
  2. 让自己闭嘴
  3. 我首先启动远程actor系统,然后运行本地actor系统。

    当我第一次运行时,一切正常,本地演员系统关闭(遥控器仍在运行)。但是,如果我第二次运行它(没有重新启动远程系统),行为是不同的,两个演员系统开始心脏跳动。 当地人没有关闭。

    复制行为的最小代码位于

    之下

    本地演员系统

    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")
    
    }
    

    这是更大代码库的一部分,这是我能够找到复制问题的最小代码。

    为什么我的本地actor系统表现不同而不是在第二次调用时关闭?

    本地演员执行以下操作

    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(); }  
    }
    

    Remoting工作正常,但对于此关机问题。

1 个答案:

答案 0 :(得分:0)

根据我的理解,下面的代码行不会停止remoteActor。

    localActor ! PoisonPill

因为PoisonPill会停止发送者角色及其所有子角色。  这里remoteActor不是localActor的子actor。 你可以分享本地演员系统的两个演员在第一次运行时停止的日志吗?