Scala 当试图从演员那里得到回应时,他收到了一封死信
我有ParentActor和2个ChildActor这是我的代码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
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)
}