如何在Akka中监管Actor并处理异常,监管代码应放置在何处
Behaviors.supervise(behavior).onFailure[IllegalStateException](SupervisorStrategy.restart) 的放置位置分两种常见场景,你可以根据你的架构设计选择:
场景1:工作Actor自身绑定监管策略
直接在工作Actor的Behavior定义外层包裹这段代码即可,监管策略会和工作Actor逻辑绑定,所有场景下Spawn该Actor都会默认生效这套故障处理规则。
示例代码:
object WorkerActor { def apply(): Behavior[WorkerCommand] = // 监管逻辑包裹原始业务Behavior Behaviors.supervise( Behaviors.receive { (ctx, msg) => // 原有数据处理逻辑,可能抛出IllegalStateException Behaviors.same } ).onFailure[IllegalStateException]( // 开启日志即可自动记录故障相关上下文信息 SupervisorStrategy.restart.withLoggingEnabled(true) ) }
场景2:Supervisor父Actor统一配置监管策略
如果需要把所有工作Actor的监管逻辑收敛到Supervisor侧管理,就在Supervisor Spawn子工作Actor的时候,把原始工作Actor的Behavior用监管代码包裹后再传入Spawn方法即可。
示例代码:
object SupervisorActor { def apply(): Behavior[SupervisorCommand] = Behaviors.setup { ctx => // 批量Spawn5个工作Actor,逐个配置监管策略 (1 to 5).foreach { idx => val supervisedWorker = Behaviors.supervise(WorkerActor()) .onFailure[IllegalStateException](SupervisorStrategy.restart) ctx.spawn(supervisedWorker, s"data-worker-$idx") } Behaviors.receiveMessage { msg => // Supervisor自身的业务逻辑处理 Behaviors.same } } }
两种方式都可以实现你需要的「遇到指定异常自动重启对应Actor、记录故障信息」的需求,如果你所有用到该工作Actor的场景都需要相同的故障处理逻辑选第一种即可,如果不同父Actor下的工作Actor需要差异化的监管策略选第二种。
内容的提问来源于stack exchange,提问作者TreyBCollier
相关产品推荐
相关产品推荐

