2011-12-09 9 views
2

Je suis nouveau à Akka et j'ai fait plusieurs fichiers de test pour pratiquer les concepts Akka. Le test suivant semblait assez simple, mais pour une raison quelconque, je suis incapable d'obtenir la valeur du futur si je reçois le futur d'un acteur. Je me suis basé toutes mes hypothèses sur les quelques exemples de la documentation akka (http://akka.io/docs/akka/1.3-RC2/scala/futures.html#futures-scala) Par exemple:Impossible d'obtenir Akka Future Value Akka 1.3-RC2

Cela fonctionne comme un assistant:

val f = Future{ 1 + 4 } 

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

Cela ne signifie pas:

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(_) 
) 
} 

J'étais très heureux de savoir que j'étais le seul qui a jamais eu ce problème en raison de l'extrême simplicité des futurs (chanceux moi). Quelqu'un pourrait-il m'aider à ouvrir les yeux sur cette question violemment évidente?

Je devrais noter que j'avais essayé de traiter à la fois dans un autre acteur, et dans une méthode principale simple. Chacun d'entre eux a échoué de la même manière impressionnante qui n'incluait aucune notification. Si le onComplete est remplacé par un simple println(future.get), j'obtiens finalement une exception de timeout (Exception dans le thread "principal" akka.dispatch.FutureTimeoutException: Futures expiré après [4996] millisecondes). Je devrais également noter que j'ai essayé d'essayer avec les versions 1.1 et 1.2 libérées d'Akka aussi bien.

Merci!

Répondre

5

Il ne s'agit en effet que d'un détail minuscule qui vous manque: votre acteur ne répond pas! Puis-je suggérer ce qui suit:

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

C'est exactement correct! J'ai incorrectement supposé "?" retourné un avenir dans le cadre de l'appel (sans avoir besoin de répondre explicitement) et self.reply était réservé pour "!" où l'acteur a répondu par référence à tout moment dans le futur. Avec le recul, je comprends parfaitement la nécessité et je suis reconnaissant pour votre réponse rapide! Merci Roland d'avoir fait ma première utilisation du débordement de pile si agréable! – Eric

+0

vous êtes les bienvenus! –