2013-05-17 3 views
0

Dans cet exemple:-Akka Testkit "future.isCompleted" check

http://doc.akka.io/docs/akka/snapshot/java/testing.html

final Props props = Props.create(MyActor.class); 
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB"); 
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000); 
assertTrue(future.isCompleted()); 
assertEquals(42, Await.result(future, Duration.Zero())); 

Qu'est-ce que: assertTrue(future.isCompleted()); chèque? Quel est le moyen de le faire retourner false?

EDIT:

J'ai trouvé le chemin comment faire isCompleted()false. J'ai false quand en classe acteur que je n'ai rien à retourner/tell retour

(mais il me semble étrange. Il semble un peu validation .. acteur capacité de revenir en arrière quelque chose pour le type particulier de message ?):

if(message instanceof PutConfigurationMessage) { 

     PutConfigurationMessage putConfigurationMessage = (PutConfigurationMessage) message; 

     initSomeConfigurations(putConfigurationMessage.getConfigurations()); 

     // here might be this line: `getSender().tell(resultMessage, getSelf());` 

} 

La question maintenant: Ce que je dois faire si je ne veux pas revenir/dire quoi que ce soit de retour? Genre de "tout droit". Aucune exception, pas de problème? ou ??

+0

N'utilisez pas "?" si vous ne voulez rien envoyer. utilisation "!". –

Répondre

0

Il affirme que future.isComplete() a renvoyé un "true". Si échouerait s'il renvoyait "faux".

1

Ce code m'a semblé faux au début. Habituellement, un futur est calculé sur un autre thread et est completed lorsque cet autre thread a fini de calculer le résultat. Il semble donc tout à fait faux d'affirmer que l'avenir isCompleted juste après l'avenir est lancé, sans attendre qu'il se termine.

Mais ce qu'ils expliquent dans le document que vous avez lié est que lorsque vous utilisez TestActorRef, le futur est calculé sur le thread même. Donc, le futur est calculé quand Pattern.ask() est appelé et seulement après que tout a été exécuté pour ce calcul, va-t-il à la ligne suivante, assert(future.isCompleted). C'est vrai en utilisant TestActorRef, mais ce ne serait pas vrai dans un vrai programme.

Ils suppriment la concurrence/multithreading pour les tests car le test du code multithread est presque impossible en raison de sa nature non déterministe.

0

Test Akka-acteurs en utilisant TestActorRef est tout à fait différent que d'utiliser ActorRef:

  • TestActorRef doit être utilisé pour test synchrone
  • ActorRef doit être utilisé pour l'intégration tests

Lors de la déclaration T estActorRef le thread en cours d'exécution de l'acteur sera un thread unique qui s'exécutera de manière synchrone et traitera l'ensemble de ActorSystem de manière synchrone sur le thread même pendant que votre test/console s'exécute.

2 paragraphe important citant de la article vous avez mentionné:

Les messages envoyés à l'acteur sont traités de façon synchrone sur le thread courant et les réponses peuvent être renvoyés comme d'habitude.

...

TestActorRef deux champs écrase: il définit le répartiteur à CallingThreadDispatcher.global et il définit le ReceiveTimeout Aucun.

J'ai trouvé une réponse pour votre nouvelle question:

Vous devez attendre un certain temps avant de vérifier future.isCompleted().
Mon code ressemble à ceci maintenant (attention à la ligne 4):

final Props props = Props.create(MyActor.class); 
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB"); 
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000); 
Await.ready(future, scala.concurrent.duration.Duration.Inf()); 
// Following assert should be true by now 
assertTrue(future.isCompleted()); 
assertEquals(42, Await.result(future, Duration.Zero())); 

Son ok pour ne pas retourner/dire quoi que ce soit de retour. Le ActorModel suggère que vous s'il y a une erreur ou des problèmes dans le travail des acteurs, que vous devriez "dire" un message d'erreur à un supervisor actor en utilisant "Fault Tolerance".
Vous ne pouvez pas utiliser isCompleted of Future si vous ne retournez pas/ne racontez rien. Pensez à utiliser un acteur superviseur pour gérer les résultats des acteurs et le tester.