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

Akka死亡观察-观察终止和重启

宗烨赫
2023-03-14

我有两个演员,父母和孩子。家长使用内容监视孩子。看(孩子)。如果孩子调用上下文。停止(自我)父级收到终止消息。但是,如果子级抛出异常,akka将重新启动该异常,但不会向父级发送终止消息。

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

据我所知,这将适用于这位演员的所有孩子。理想情况下,我希望对个别孩子(演员类型)有一个不同的监督策略,所以我想使用

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

我工作,但这似乎有点像黑客。还有其他我不知道的选择吗?

非常感谢!

共有2个答案

裴存
2023-03-14

Akka演员监督策略更侧重于处理异常,并基于异常您可以决定要遵循的操作。

在您的情况下,您希望使它基于actor,如果是这种情况,不同类型的actor必须返回不同的异常。

因此,最好是根据异常类型执行操作。如果情况并非如此,并且抛出了类似的异常,那么最好将它们包装到参与者级别,然后返回到更高级别的参与者。

侯博裕
2023-03-14

我不知道有哪种每参与者类型的监督模型,但我想到的是,您可以捕获子参与者中的异常并将其封装到信封中:

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

如果您手动抛出异常,甚至更容易,只需直接抛出包装好的异常。

然后在父级中,决定每种异常类型:

override val supervisorStrategy = OneForOneStrategy() {
    case e: DontRestartMeException => Stop
    case _: Exception => Restart
}
 类似资料:
  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 是否有一种设计模式可以形成一个“复合”观察者/可观察者? 我的意思是我有一个可观察的,它在某个变化时通知它的监听器。 每个监听器也是一个可观察的,并通知它自己的监听器(在某个动作上,它做了哪个动作是由第一个可观察的通知触发的)。 这种观察者/可观察的“链接”作为设计是可以的,还是有一个标准的模式?

  • 我试图理解当我使用 在或之后,在我使用时返回true 我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。

  • 我们支持使用分布式消息系统,例如 etcd 来保持多个Casbin执行器实例之间的一致性。 因此,我们的用户可以同时使用多个Casbin 执行器来处理大量的权限检查请求。 与策略存储 adapters类似,我们没有把watcher的代码放在主库中。 任何对新消息系统的支持都应该作为watcher程序来实现。 完整的Casbin watchers列表如下所示。 欢迎任何第三方对 watcher 进行

  • 键值观察 - KVO 在 KVO 里,对象可以注册监听任何属性的变化,不管它是否持有。如果感兴趣的话,可以读一读苹果 KVO 编程指南。 如何使用 KVO 正如前面所提及的, 对象可以关注任何属性的变化。在我们的例子里,我们可以用 KVO 关注 UIImageView 的 image 属性变化。 打开 AlbumView.swift 文件,找到 init(frame:albumCover:) 方法