2014-07-16 6 views
1

J'ai le code suivant qui appelle deux requêtes avec un léger retard.Akka scheduling

final ActorRef actor1 = getContext().actorOf(
      ActorClass.props(context, 
      "actor1"); 
    futures.add(ask(actor1 , msg1, t)); 

    final ActorRef actor2 = getContext().actorOf(
      ActorClass.props(context, 
      "actor2"); 
    futures.add(Patterns.after(Duration.create(10000, TimeUnit.MILLISECONDS), 
      getContext().system().scheduler() , 
      getContext().dispatcher(), ask(actor2,msg2,t))); 

Dans actor1 et actor2, j'appelle une requête REST qui renvoie un cookie avec le message de réponse. Mon intention est de retarder l'envoi de la requête REST correspondant à l'acteur 2. Cependant ce que j'ai observé des logs est que la demande est envoyée immédiatement des deux acteurs et seulement le traitement de réponse (entre deux futurs) est retardé de 10 secondes. Est-ce que ce comportement prévu de planificateur dans Akka? Si je veux retarder l'initiation de la requête entre les deux acteurs dans le cas ci-dessus, puis-je utiliser Thread.sleep? (J'ai lu quelque part qu'il n'est pas recommandé d'utiliser Thread.sleep dans un acteur akka). Apprécier les entrées.

Répondre

2

Le modèle after(..., Future<T>) a une sémantique différente de celle que vous supposez avoir.

Cette version du modèle after commencera à s'exécuter tout de suite et retardera l'achèvement du futur généré par cette méthode. Si vous voulez toutefois retarder le début de l'exécution, vous devez utiliser le after(..., Callable<Future<T>>). En d'autres termes, comparez ces deux méthodes:

// example code in Scala, but uses Java API 

// future executes ASAP 
print("Hello ") 
Patterns.after(1.second, sys.scheduler, sys.dispatcher, Future { println("World!") }) 

// future executes after 1 second 
print("Hello ") 
Patterns.after(1.second, sys.scheduler, sys.dispatcher, 
    new Callable[Future[Unit]] { 
    override def call() = Future { println("World!") } 
    } 
) 

Happy hakking!