2013-03-08 44 views
2

我正在使用Scala 2.10/Akka 2.1/Play 2.1,並且我有一個關於firstCompletedOf的問題。如何識別firstCompletedOf正文中的結果發件人?請看下面的代碼:akka firstCompletedOf,確定消息發件人

val futureString: Future[String] = myTestActor.ask(Message).mapTo[String] 
val timeoutFuture = play.api.libs.concurrent.Promise.timeout("timed_out", 5 seconds) 

Async { 
    Future.firstCompletedOf(Seq(futureString, timeoutFuture)).map { 
    case result: String => { 
     println("got message " + result) 
    } 
    } 
} 

在某些時候,裏面myTestActor有一個sender ! "actor_result",但超時可能是第一位的。

是否有一種快速,方便的方法來識別結果的發件人? sender不起作用,我認爲檢查字符串(如果等於timed_out)將會很骯髒。

+0

我不知道這是一個答案,所以我把它在一個評論...「告訴,不要問!」此外,當你確實告訴時,告訴接收方在哪裏指示任何答覆/答覆/結果。這使得可以更容易地以不同方式重用和重組的演員的更靈活的拓撲結構。 – 2013-03-08 16:55:36

回答

0

如何像:

val futureString: Future[String] = myTestActor.ask(Message).mapTo[String] 
val timeoutFuture: Future[String] = play.api.libs.concurrent.Promise.timeout(throw new TimeoutException(), 5 seconds) 

Async { 
    Future.firstCompletedOf(Seq(futureString, timeoutFuture)) map { 
    case result: String => println("got message " + result) 
    } recover { 
    case _: TimeoutException => "Timed out?" 
    } 
} 
+0

謝謝維克多。我很難在Scala/Akka/Play中繼續前進。我不願意購買一本書,因爲事情似乎變得非常快,而且在線材料很稀疏而且矛盾。對此有何幫助? – ticofab 2013-03-12 10:55:00

+0

Scala編程1Ed是免費的:http://www.artima.com/pins1ed/,Akka文檔大約500頁,免費:http://akka.io/docs/,Play文檔是免費的:http://www.playframework.com/documentation/2.1.0/Home。最重要的是,可以免費獲得過多的會議討論。如果您正在使用Typesafe Stack,則還有以下資源:http://typesafe.com/resources/documentation – 2013-03-12 12:24:13