Я пытаюсь правильно обработать исключения в моих проектах Akka с помощью супервизоров. Просто хотел убедиться, что это правильный подход к вещам.
У меня есть 1 система актеров, которая создает 4 отдельных актера. Допустим, 1 мой актер наносит удар по БД. Является ли стратегия надзора правильным способом обработки вещей?
object ExceptionHandlingSupervisor extends App{
val actorSystem = ActorSystem("ExceptionHandlingActorSystem")
val actor = actorSystem.actorOf(Props[SupervisorActor], "SupervisorActor")
actor ! Start
class SupervisorActor extends Actor {
val dbActor = context.actorOf(Props[ChildActor],"ChildActor")
override def receive: Receive = {
case Start => dbActor ! HitDatabase("","")
}
override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false){
case ae:SQLException => println("Found an SQLException") //Add my logging logic here and error notification logic here
Resume
case _:Exception => println("Found an Exception")
Restart
}
}
class ChildActor extends Actor{
override def receive: Receive = {
case HitDatabase(user,pass) => dbFunction(user,pass)
}
}
}
Будет ли приведенный выше код подходить для этого подхода, или мне следует придерживаться обычного блока Try / Catch:
class DbActor extends Actor{
override def receive: Receive = {
case HitDatabase(user,pass) =>
try{
dbFunction(user,pass)
}
catch {
case ae:SQLException => println("Found an SQLException") //Add my logging logic here and error notification logic here
}
Также я был бы очень признателен, если бы вы могли сказать,
почему при таких обстоятельствах следует выбирать подход супервизора вместо обычной обработки исключений?
Можем ли мы указать некоторую другую логику обработки ошибок в supervisorStrategy, кроме выполнения Resume или Restart?