我所有的 Actor 都从BaseActor
继承而来,可以使用registerActor()
创建子 Actor
abstract class BaseActor() : AbstractLoggingActor() {
protected fun registerActor(childProps: Props, name: String): ActorRef {
val child = context.child(name)
val supervisorProps = BackoffSupervisor.props(
BackoffOpts.onFailure(
childProps,
name,
java.time.Duration.ofSeconds(1),
java.time.Duration.ofSeconds(30),
0.2 // adds 20% "noise" to vary the intervals slightly
).withAutoReset(FiniteDuration(20, TimeUnit.SECONDS))
)
return if (child.isEmpty) {
context.actorOf(supervisorProps, "supervisor_$name").also { addChildRoutee(it) }
} else {
child.get()
}
}
}
当 Actor
/user/dad
使用registerActor()
创建2个子 Actor 时,会创建2个主管/user/dad/supervisor_foo/foo
/user/dad/supervisor_bar/bar
如何重用同一主管来监督
foo
和bar
?/user/dad/supervisor/foo
/user/dad/supervisor/bar
最佳答案
BackoffSupervisor
仅支持一个(直接) child 。
如果要重新使用BackoffSupervisor
,唯一的方法是将另一个主管作为其子级:
/user/dad/backoffsupervisor/supervisor/foo
/user/dad/backoffsupervisor/supervisor/bar
其中
/user/dad/backoffsupervisor
是BackoffSupervisor
,而/user/dad/backoffsupervisor/supervisor
是监视其子项(foo
和bar
)并在任何一个子项停止时都停止的参与者,将故障级联到退避主管上。