Akka / Futures - 根据成功或失败管道不同的消息?

时间:2017-03-03 15:57:24

标签: scala akka future

我在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

1 个答案:

答案 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)