我在Actor上有以下代码,我要求其他人采取行动(在外部数据库中保留某些内容)
如果成功:
然后我向自己发送一条消息,以反映我当地州的行动结果,然后将其返回原来的sender
。
如果失败对DB的持久性:
然后我想直接回复当前发件人Status.Failure
(已退回给我)。
代码如下所示:
case Event(SomeAction(name), _) =>
val origin = sender()
ask(someOtherActor, SomeAction(name)).mapTo[ActionResult]
.map(ActionCompleted)
.onComplete {
case Success(value) => self.tell(value, origin)
case Failure(e) => origin ! Status.Failure(e)
}
stay()
case Event(ActionCompleted(result), state) =>
stay using state.update(result) replying result
上面的代码有效,但我需要依赖将发送者复制到局部变量中以避免关闭它。
我想知道是否有更好的方法可以使用pipeTo
?
答案 0 :(得分:3)
您可以构建自己的pipeTo
来满足您的需求。我认为routeTo
对它来说是一个好名字。
implicit class RouteTo[A](f: Future[A]) {
import akka.pattern.pipe
def routeTo(successDestination: ActorRef,
failureDestination: ActorRef)(
implicit sender: ActorRef,
ec: ExecutionContext): Unit =
f onComplete {
case s @ Success(_) => successDestination.tell(s, sender)
case f @ Failure(_) => failureDestination.tell(f, sender)
}
}
import RouteTo._
Future("hello").routeTo(successRecipient, failureRecipient)