Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 当试图从演员那里得到回应时,他收到了一封死信_Scala_Akka_Future - Fatal编程技术网

Scala 当试图从演员那里得到回应时,他收到了一封死信

Scala 当试图从演员那里得到回应时,他收到了一封死信,scala,akka,future,Scala,Akka,Future,我有ParentActor和2个ChildActor这是我的代码 Class ParentActor extends Actor { val mongoActor = context.of..... val esActor = context.of ............ def receive { case InserInMongo(obj) => val mFuture = ask(mongoActor, InsertDataInMongo(object)).mapTo[Bool

我有ParentActor和2个ChildActor这是我的代码

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)
}
一切都很好,但如果我在MongoChildator中得到一些MongoException,我就无法获得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'.

我想要的是,如果我在mongo中得到异常,我得到了异常,然后它应该继续执行ES并返回其结果(其成功值或异常)

不要在
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)
 }

不要在
receive
中抛出异常,也不要关闭
sender
sender
是一个函数,它仅在
receive
的上下文中有效,您正在另一个线程上的
内部使用它

像这样的东西可以满足您的需求:

 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)
 }