我有 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
,也不要关闭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)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句