Может ли BackoffSupervisor иметь несколько дочерних акторов?

Все мои актеры наследуются от 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

Как я могу повторно использовать одного и того же руководителя для наблюдения за foo и bar?

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

person Lorenzo Belli    schedule 18.09.2019    source источник


Ответы (1)


BackoffSupervisor поддерживают только одного (прямого) дочернего элемента.

Если вы хотите повторно использовать BackoffSupervisor, единственный способ - ввести другого супервизора в качестве его дочернего элемента:

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

Где /user/dad/backoffsupervisor — это BackoffSupervisor, а /user/dad/backoffsupervisor/supervisor — это актор, который наблюдает за своими дочерними элементами (foo и bar) и останавливается, когда любой из дочерних элементов останавливается, каскадно передавая сбой диспетчеру отсрочки.

person Frederic A.    schedule 22.09.2019