2010-11-17 11 views
1

J'essaie de faire fonctionner un acteur mais cela ne fonctionne que partiellement. MyActor se met au travail toutes les secondes et exécute une tâche en s'appelant lui-même dans une boucle.Scala L'acteur ne fonctionne pas comme prévu

Cette partie fonctionne très bien.

Je voudrais également appeler MyActor de manière aléatoire à partir d'autres parties de mon application.

Cela ne fonctionne PAS. MyActor incrémente sa boîte aux lettres mailboxSize, puis continue avec la boucle et ne récupère jamais aucun des messages envoyés de l'extérieur.

case class DoJob(fast:Boolean) 

object MyActor extends Actor { 

    def act = { 
    loop { 
     MyActor ! DoJob(false) 
     receive { 
     case DoJob(fast) => { 
      Job.perform(fast) 
     } 
     } 
     Thread.sleep(1000) 
    } 
    } 
} 

Ce qui suit ne fonctionne pas en termes d'appel DoJob (vrai), mais incrémente simplement la taille de la boîte aux lettres de MyActor:

MyActor ! DoJob(true) 

Qu'est-ce qui pourrait être mal ici?

+1

Vous avez appelé '.start' dessus, non? – wheaties

+0

Oui, oui, la boucle fonctionnerait-elle autrement? – trajectory

Répondre

3

Chaque appel à receive reçoit uniquement un message. Puisque vous vous envoyez un message juste avant d'appeler recevoir, vous ne réduirez jamais la taille de la boîte aux lettres dans cette boucle.

Vous devez créer un thread distinct pour envoyer le signal de présence ou utiliser receiveWithin et un TIMEOUT.

+0

Merci pour la réponse! Disons que je crée un Thread distinct, l'acteur va-t-il voir les problèmes de concurrence en termes de la méthode Job.perform (rapide) appelée de nouveau quelque part AVANT qu'elle ne soit terminée? – trajectory

+0

@getagrip Je suis sûr que par "thread séparé", Ben signifie "acteur séparé". –