1

我所有的演员都继承自BaseActor并可以创建子演员registerActor()

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

当一个演员/user/dad创建 2 个子演员时,registerActor()但是创建了 2 个主管

/user/dad/supervisor_foo/foo
/user/dad/supervisor_bar/bar

如何重用同一个主管来监督foobar

/user/dad/supervisor/foo
/user/dad/supervisor/bar
4

1 回答 1

2

BackoffSupervisors 只支持一个(直接)孩子。

如果你想重用 aBackoffSupervisor唯一的方法是引入另一个主管作为它的孩子:

/user/dad/backoffsupervisor/supervisor/foo
/user/dad/backoffsupervisor/supervisor/bar

哪里/user/dad/backoffsupervisor是 a BackoffSupervisor,哪里/user/dad/backoffsupervisor/supervisor是一个观察其孩子 (foobar) 的演员,并在任何一个孩子停止时停止,将故障级联到退避主管。

于 2019-09-22T07:53:51.823 回答