2011-12-09 45 views
2

我是Akka新手,并且正在制作几个测试文件来练习Akka概念。下面的测试似乎很简单,但无论出于何种原因,如果我从演员接收未来,我都无法获得未来的价值。我基于所有我从阿卡文档(http://akka.io/docs/akka/1.3-RC2/scala/futures.html#futures-scala)例如几个例子假设:无法获得Akka未来价值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:期货在[4996]毫秒后超时)。我还应该注意到,我的确试图尝试使用1.1和1.2版本的akka​​。

谢谢!

回答

5

这确实只是你想念的一个小细节:你的演员没有回复!我可以提出以下建议:

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

这完全正确!我错误地认为“?”作为调用的一部分返回了未来(不需要明确回复),并且self.reply保留为“!”演员在未来的任何时候通过引用回复。事后看来,我完全理解这种必要性,并感谢您的及时回应!感谢Roland让我第一次使用堆栈溢出这么愉快! – Eric

+0

你是最受欢迎的! –