получение мертвого письма от актера при попытке получить ответ от него - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть ParentActor и 2 ChildActors, вот мой код

Class ParentActor extends Actor {

val mongoActor = context.of.....
val esActor = context.of ............

def receive {
case InserInMongo(obj) =>
val mFuture = ask(mongoActor, InsertDataInMongo(object)).mapTo[Boolean]
      mFuture.onComplete {
        case Success(resultMongo) =>
             sender ! resultMongo
        case Failure(e) =>
            sender ! akka.actor.Status.Failure(e)
            throw e
        }   

case InserInES(obj) =>
val eFuture = ask(esActor, InsertDataInES(object)).mapTo[Boolean]
      eFuture.onComplete {
        case Success(resultES) =>
             sender ! resultES
        case Failure(e) =>
            sender ! akka.actor.Status.Failure(e)
            throw e
        }
}
}

, вот код вызова

class Demo {
    val mongoFuture = ask(parentActor, InsertInMongo(obj))
            .mapTo[Boolean]
            .recover {
              case e =>
                println("error in mongo: " + e)
                false
            }

          val esFuture = ask(parentActor, InsertInES(obj))
            .mapTo[Boolean]
            .recover {
              case e =>
                println("error in ES: " + e)
                false
            }

          val f = Future.sequence(List(mongoFuture, esFuture))
          val result: Seq[Boolean] = Await.result(f, Duration.Inf)
          log.info ("result {}",result)
}

все работает нормально, но если я получаю исключение MongoException в mongoChildActor, я не могучтобы получить результат родительского актера для ES

вот что я получаю

17:19:45.782 [MyActorSystem-akka.actor.default-dispatcher-4] INFO  akka.actor.DeadLetterActorRef - Message [java.lang.Boolean] from Actor[akka://MyActorSystem/user/ParentActor#1383701267] to Actor[akka://MyActorSystem/deadLetters] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

Все, что я хочу, это если я получу исключение в Монго, я получу исключение, а затем оно должно перейти к ESи вернуть его результат (либо его успешное значение, либо исключение)

1 Ответ

0 голосов
/ 19 февраля 2019

Не выбрасывайте исключения в receive и не закрывайте sender (sender - это функция, которая действует только в контексте receive, вы используете ее внутри .onCompleteна другой ветке).

Что-то подобное должно делать то, что вы хотите:

 import akka.pattern.pipe
 def receive: Receive = {
   case InserInMongo(obj) =>
     ask(mongoActor, InsertDataInMongo(object)).pipeTo(sender)   

  case InserInES(obj) =>
     ask(esActor, InsertDataInES(object)).pipeTo(sender)

 }

Или, еще проще:

 def receive: Receive {
   case msg: InsertDataInMongo =>
      mongoActor.forward(msg)
   case msg: InsertDataInES =>
      esActor.forward(msg)
 }
...