2011-12-09 5 views
2

Akkaに慣れていて、Akkaの概念を実践するためのいくつかのテストファイルを作成しています。次のテストは十分に単純だと思われましたが、何らかの理由で、私は将来、俳優から将来を受け取った場合、未来の価値を得ることができません。私は、例えば、アッカのドキュメント(http://akka.io/docs/akka/1.3-RC2/scala/futures.html#futures-scala)からいくつかの例にすべての私の仮定をもと:Akka Future Valueを入手できません。Akka 1.3-RC2

これは、ウィザードのように動作します:

val f = Future{ 1 + 4 } 

f onComplete 
{ 
    _.value.get.fold(
    v => throw new Exception("My Exception"), 
    println(_) 
) 
} 

はこれはしていません:

class FutureDemo extends Actor 
{ 
    def receive = 
    { 
    case (a: Int, b: Int) => 
     a + b 
    } 
} 

val fa1 = actorOf[FutureDemo].start() 

val future = fa1 ? (1, 2) 

future onComplete 
{ 
    _.value.get.fold(
    v => throw new Exception("My Exception"), 
    println(_) 
) 
} 

、私は非常にでした先物(幸運な私)の極端な単純さのためにこの問題を抱えていたのは、私が唯一の人だったことを喜んで喜んでいる。誰もが激しく明白な問題に私の目を開くのを助けるだろうか?

私は別のアクターの内部と簡単なメインメソッドの両方で処理しようとしていたことに注意してください。いずれも通知が全く含まれていない同じ素晴らしい方法で失敗しました。 onCompleteが単純なprintln(future.get)に置き換えられた場合、最終的にタイムアウト例外が発生します(スレッド "main"の例外akka.dispatch.FutureTimeoutException:Futuresが[4996]ミリ秒後にタイムアウトしました)。また、1.1と1.2のリリースされたakkaも試してみました。

ありがとうございます!

答えて

5

実際にあなたが欠けている細かいディテールの1つです。あなたの俳優は返信しません!次のようにお勧めします:

class FutureDemo extends Actor { 
    def receive = { 
    case (a: Int, b: Int) => self.reply(a + b) 
    } 
} 
+0

これは間違いありません。私は間違って "?"コールの一部として未来を返す(明示的に返信する必要なし)、self.replyは "!"のために予約されていた。その俳優は将来、いつでも参考に返答しました。後見では、私は必要性を完全に理解しており、あなたの迅速な対応に感謝しています!私の最初のスタックオーバーフローを楽しくするためのRolandをありがとう! – Eric

+0

あなたは大歓迎です! –

関連する問題