如何在 Akka 中监督 actor 并处理异常
Posted
技术标签:
【中文标题】如何在 Akka 中监督 actor 并处理异常【英文标题】:How to supervise actors in Akka and handle exceptions 【发布时间】: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
【参考方案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))
【讨论】:
以上是关于如何在 Akka 中监督 actor 并处理异常的主要内容,如果未能解决你的问题,请参考以下文章