Новый для Акки.Создание нового класса Scala, расширяющего SupervisorStrategy
, дает мне следующий шаблон для работы:
class MySupervisorStrategy extends SupervisorStrategy {
override def decider: Decider = ???
override def handleChildTerminated(context: ActorContext, child: ActorRef,
children: Iterable[ActorRef]): Unit = ???
override def processFailure(context: ActorContext, restart: Boolean,
child: ActorRef, cause: Throwable, stats: ChildRestartStats, children: Iterable[ChildRestartStats]): Unit = ???
}
Я ищу способ доступа:
-
Throwable
/ Exception
, которое было выброшено из дочернего актера - Дочерний актер
ActorRef
, выдавший исключение - Сообщение, которое было передано дочернему актору, который вызвал исключение для выброса
Я думаю, Decider
(который на самом деле PartialFunction[Throwable,Directive]
) получает Throwable
всякий раз, когда ребенок выдает исключение, но я не вижу, гдеЯ мог бы получить доступ к № 2 и № 3 из моего списка выше. Есть идеи?
Обновление
Из опубликованной скрипки выглядит как действительный Decider
:
{
case ActorException(ref,t,"stop") =>
println(s"Received 'stop' from ${ref}")
Stop
case ActorException(ref,t,"restart") =>
println(s"Received 'restart' from ${ref}")
Restart
case ActorException(ref,t,"resume") =>
println(s"Received 'resume' from ${ref}")
Resume
}
вышеЯ вижу все три:
- Исключение, которое было сгенерировано дочерним элементом
- Дочерний объект (
ref
), выдавший исключение - Сообщение, которое былопервоначально отправлено ребенку (что вызвало исключение)
Похоже, что в этом Decider
нет ничего, что нуждается в , который будет определен внутри этого Supervisor
класса,Я хотел бы вывести логику Decider
, скажем, в MyDecider.scala
и найти способ реорганизовать Supervisor
, чтобы его supervisorStrategy
использовал экземпляр MyDecider
, так что, возможно, что-то похожее на:
class Supervisor extends Actor {
import akka.actor.OneForOneStrategy
import akka.actor.SupervisorStrategy._
import scala.concurrent.duration._
var child: ActorRef = _
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute, decider = myDecider)
...
}