【问题标题】:How to supervise actors in Akka and handle exceptions如何在 Akka 中监督 actor 并处理异常
【发布时间】:2021-11-24 19:46:18
【问题描述】:

我正在尝试改进系统中参与者的错误处理。有时,在处理数据时出现问题,我需要停止并重新启动actor,并记录有关此故障的一些信息。

我有一个主管,有 5 个演员为它工作。所以我需要能够监督他们所有人。我找到了这个链接:

https://doc.akka.io/docs/akka/current/typed/fault-tolerance.html

关于这个,但我认为在哪里实现代码并不是很清楚:

Behaviors.supervise(behavior).onFailure[IllegalStateException](SupervisorStrategy.restart)

这段代码到底应该去哪里?

谢谢

【问题讨论】:

  • 目前还不清楚您是在询问经典 API 还是类型化 API(如果是类型化 API,我建议添加 akka-typed 标签(可能替换 actor 标签)。经典 API 中的监督(例如,您有 extends Actor 的代码)非常不同,并记录在 doc.akka.io/docs/akka/current/supervision-classic.html
  • 嗨,是的,对不起,你是对的。我正在使用经典演员。我试图找到一些似乎适用于我的场景的东西。每个主管有 5 个子角色,如果其中一个角色失败,我需要在错误级别记录它,并检索该角色正在处理的数据。 @LeviRamsey

标签: scala akka actor akka-actor akka-supervision


【解决方案1】:

您可以将此supervisor 视为另一个behavioiur,它将您的behaviour 包裹在其中。

假设您想要关注 HelloWorld 演员。

object HelloWorldActor {

  sealed trait Command
  case class HelloCommand(name: String) extends Command

  def apply(): Behavior[Command] =
    Behaviors.receiveMessage[Command] { 
      case msg: HelloCommand =>
        println(s"Hello ${msg.name}")
        Behaviors.same
    }

}

现在,您可以用“主管”“包装”这种“行为”

object SupervisedHelloWorldActor {

  sealed trait Command
  case class HelloCommand(name: String) extends Command

  def apply(): Behavior[Command] =
    Behaviors.supervise(
      Behaviors.receiveMessage[Command] { 
        case HelloCommand(name) =>
          println(s"Hello ${name}")
          Behaviors.same
      }
    ).onFailure(onFailure[IllegalStateException](SupervisorStrategy.restart))

}

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多