我如何获得演员被终止的信息?

问题描述

假设我有一些根actor(不是由另一个actor创建的,而是由其他地方创建的)。我如何监控这个演员?我如何获得演员被终止的信息?

解决方法

最好使用您可以观看的 actorSelection 创建父 actor 并生成一个子actor。创建子actor 后,您可以使用context.watch(child) 观看它。然后,一旦你有了这个子actor,你就发送一个PoisonPill来检查这个actor是否还活着。这是一个简单的例子:

import akka.actor.{Actor,ActorLogging,ActorSystem,PoisonPill,Props,Terminated}

object WatchingActors {

  def main(args: Array[String]): Unit = {
    import ParentWatcher._
    val system = ActorSystem("WatchingActors")
    val parentWatcherActor = system.actorOf(Props[ParentWatcher],"parentWatcher")
    parentWatcherActor ! StartChild("child3")
    val child3 = system.actorSelection("/user/parentWatcher/child3")
    // make sure that child3 has been created
    child3 ! s"[1] child3,are you still there?"
    Thread.sleep(1000)
    child3 ! s"[2] child3,are you still there?"
    // SENDING A POISON PILL TO SIMULATE THE DEATH
    child3 ! PoisonPill
    for (i <- 3 to 50) child3 ! s"[$i] child3,are you still there?"
  }

  object ParentWatcher {
    case class StartChild(name: String)
    case class StopChild(name: String)
    case object Stop
  }

  // This is a better parent actor
  class ParentWatcher extends Actor with ActorLogging {
    import ParentWatcher._
    override def receive: Receive = {
      case StartChild(name) =>
        log.info(s"[ParentWatcher] Starting child $name")
        val child = context.actorOf(Props[Child],name)
        // WATCH THE ACTOR HERE
        context.watch(child)
      case Terminated(actorRef) =>
        // GET THE CHILD ACTOR REFERENCE THAT JUST DIED
        log.info(s"the reference that I am watching ${actorRef.path.name} has been stopped")
    }
  }
  class Child extends Actor with ActorLogging {
    override def receive: Receive = {
      case message => log.info(message.toString)
    }
  }
}

日志:

[1] child3,are you still there?
[2] child3,are you still there?
Message [java.lang.String] to Actor[akka://WatchingActors/user/parentWatcher/child3#1022823549] was not delivered. [1] dead letters ...
Actor[akka://WatchingActors/user/parentWatcher/child3#1022823549] was not delivered. [2] dead letters ...
....
the reference that I am watching child3 has been stopped
Message [java.lang.String] to Actor[akka://WatchingActors/user/parentWatcher/child3#1022823549] was not delivered. [6] 
...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...