试图从演员那里得到回应时收到来自演员的死信

斯瓦希德

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

一切正常,但如果我在 mongoChildActor 中得到一些 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,也不要关闭sendersender是一个函数,仅在 的上下文中有效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)
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章