Как контролировать кластерный синглтон в Акке?
Я пытаюсь контролировать Akka Actor, точнее Cluster Singleton, созданного с использованием ClusterSingletonManager
, Я пытаюсь добиться большего контроля над исключениями, журналами и жизненным циклом актера.
К сожалению, после реализации решения я сделал исключения для синглтон-актера, но в журналах ничего не показывалось, ни актер, ни кластер не отключались.
Моя реализация выглядит следующим образом:
object SingletonSupervisor {
case class CreateSingleton(p: Props, name: String)
}
class SingletonSupervisor extends Actor with ActorLogging {
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 0, withinTimeRange = 1.minute) {
case x: ActorInitializationException =>
log.error(s"Actor=<${x.getActor}> trowed an exception=<${x.getCause}> with message=<${x.getMessage}>")
Stop
case x: ActorKilledException => Stop
case x: DeathPactException => Stop
case x: Exception =>
log.error(s"Some actor threw an exception=<${x.getCause}> with message=<${x.getMessage}>, trace=<${x.getStackTrace}>")
Escalate
}
def receive = {
case CreateSingleton(p: Props, name: String) =>
sender() ! context.actorOf(p)
context.actorOf(ClusterSingletonManager.props(
singletonProps = p,
terminationMessage = PoisonPill,
settings = ClusterSingletonManagerSettings(context.system)),
name = name)
}
}
Итак, возможно ли даже контролировать Cluster Singlegon? Если возможно, как я должен атаковать эту проблему?
1 ответ
Одним из возможных решений является создание актера-супервизора, который порождает данного ребенка с данным supervisorStrategy
и пересылает сообщения своему ребенку.
Вот супервайзер актера:
class SupervisorActor(childProps: Props, override val supervisorStrategy) extends Actor {
val child = context.actorOf(childProps, "supervised-child")
def receive: Receive = {
case msg => child forward msg
}
}
и вот как вы создаете контролируемого актера как кластер синглтон
context.actorOf(ClusterSingletonManager.props(
singletonProps = Props(classOf[SupervisorActor], p, supervisorStrategy),
terminationMessage = PoisonPill,
settings = ClusterSingletonManagerSettings(context.system)),
name = name)