当前位置: 首页 > 知识库问答 >
问题:

当失败时,谁的责任是创造Akka演员的孩子?

翁翰
2023-03-14

重新启动期间的精确事件顺序如下:挂起actor(这意味着它在恢复之前不会处理正常消息),并递归挂起所有子节点。

一个误导性的引用说:

恢复一个行动者将恢复它的所有从属,重新启动一个行动者意味着重新启动它的所有从属,同样地,终止一个行动者也将终止它的所有从属

  test("restart test") {
    val system = ActorSystem("test")
    val supervisor = system.actorOf(Props(new Supervisor), "supervisor")
    supervisor ! CREATE(Props(new First), "first")
    Thread.sleep(500)

    val first = system.actorFor("akka://test/user/supervisor/first")
    first ! CREATE(Props(new Second), "second")
    Thread.sleep(500)
    supervisor ! WTF

    Thread.sleep(20000)
  }

  case object WTF
  case class CREATE(p: Props, name: String)

  class Supervisor extends Actor {
    override val supervisorStrategy =
      OneForOneStrategy(maxNrOfRetries = 10) {
        case _: IllegalStateException       => Restart
        case _: IllegalArgumentException    => Stop
        case _: Exception                   => Restart
    }
    override def preStart() {
      println(s"$self starts")
    }
    override def postStop() {
      println(s"$self stopped")
    }
    override def receive = {
      case WTF => println("throwing exception"); throw new IllegalStateException()
      case CREATE(p, name) => context.actorOf(p, name)
    }
  }
  class First extends Actor {
    override def preStart() {
      println(s"$self starts")
    }
    override def postStop() {
      println(s"$self stopped")
    }
    override def receive = {
      case WTF => println("throwing exception"); throw new IllegalStateException()
      case CREATE(p, name) => context.actorOf(p, name)
    }
  }
  class Second extends Actor {
    override def preStart() {
      println(s"$self starts")
    }
    override def postStop() {
      println(s"$self stopped")
    }
    override def receive = {
      case WTF => println("throwing exception"); throw new IllegalStateException()
      case CREATE => sender ! "ok"
    }
  }

参与者[Akka://test/user/supervisor#1599926629]启动参与者[Akka://test/user/supervisor/first#2012011668]启动参与者[Akka://test/user/supervisor/first/second#1750038710]启动

抛出异常参与者[Akka://test/user/supervisor#1599926629]停止[ERROR][06/26/2013 11:11:16.899][test-akka.actor.default-dispatcher-4][Akka://test/user/supervisor]null java.lang.IllegalStateException at com.fg.mail.smtp.integrationSuite$supervisor$$anonfun$Receive$1.ApplyRelse(integrationsuite.scala:40)at box.scala:237)在akka.dispatch.mailbox.run(mailbox.scala:219)在akka.dispatch.forkJoinExecutorConfigurator$AkkaForkJoinAsk.exec(AbstractDispatcher.scala:386)在scala.concurrent.forkJoinAsk.doexec(forkJoinAsk.java:262)在scala.concurrent.forkJoinAsk.forkJoinAsk.doexec(forkJoinAsk.java:262)在运行(ForkJoinWorkerThread.java:104)

参与者[Akka://test/user/supervisor/first/second#1750038710]停止参与者[Akka://test/user/supervisor/first#2012011668]停止参与者[Akka://test/user/supervisor#1599926629]开始

共有1个答案

燕英逸
2023-03-14

你的怀疑是正确的。如果仔细查看http://doc.akka.io/docs/akka/snapshot/general/supervision.html上关于重新启动过程的7个步骤描述,您将看到:

2...默认将终止请求发送给所有孩子...

 类似资料:
  • 我从这里得到上面的错误消息: 特别是从第二行。。进口是 akka版本是2.2.1,scala是2.10.2,我正在使用sbt 0.13来构建它。 编辑:我用 结果如下:

  • 我有一个单身演员的等级制度。父母监督和协调孩子。当重新启动协调器时,我需要保持子角色运行。有没有一种方法可以防止子角色在其父角色重新启动时重新启动,或者我应该重新考虑我的角色层次结构?我一直在研究akka的监管策略,但找不到明确的答案。

  • 请注意:虽然我更喜欢使用Akka的JavaAPI的解决方案(这就是我正在使用的),但我对任何工作解决方案都很满意,并且可能会想出如何将基于Scala的答案翻译成Java。 我有一个Akka应用程序,有很多演员,其中两个是和。actor可以接受两种类型的消息: ;和 执行器简单地接受一条消息。这些参与者和系统其他部分之间的消息流如下: 任何东西(其他参与者,甚至参与者系统之外的事件驱动组件)都可以随

  • [04/27/2014 18:09:05.518][ReadScheduler-Akka.actor.Default-Dispatcher-3][Akka://ReadScheduler/User/Collector]从参与者[Akka://ReadScheduler/User/Executor#2127791644]到参与者[Akka://ReadScheduler/User/Collector

  • 我正在将现有应用程序从Akka Classic移植到Akka Typed。最初,您可以使用上下文获取对参与者的引用。actorSelection()。resolveOne() 我知道在Akka Type中不再支持这一点,我们应该使用来注册演员以供发现。 但是,我只想将消息发送到本地参与者,即存在于集群中每个节点上的本地单例。我有它的本地路径,但没有对它的直接引用。这是因为它是由Akka管理系统创建

  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?