2017-03-03 58 views
1

我有上演員下面的一段代碼,我問別人一個動作(堅持的東西在外部DB)Akka /期貨 - 根據成功或失敗管道不同的消息?

如果是成功
後來我發信息給我以反映我在當地州的行動結果,然後將其返回原始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

回答

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)