2011-09-28 3 views
1

Comment exécuter 2 acteurs Akka avec l'appelant qui envoie un message au consommateur toutes les n secondes? Comme il n'y a pas de boucle réagissent les méthodes comme dans la bibliothèque Scala.Actors Je suis coincé en quelque sorte, ce qui suit ne compilera pas et produit:comment configurer correctement Akka.Actors par rapport à Scala.Actors

méthode remplaçant reçoivent Actor trait de type => Caller.this .Recevoir; méthode receive est de type incompatible

object Foo { 
    def init() { 
    actorOf[Caller].start() 
    actorOf[Consumer].start() 
    } 
} 

class Caller extends Actor { 

    def receive { 
    while (true) { 
     self ! "msg" 
     Thread.sleep(1000) 
    } 
    } 
} 

class Consumer extends Actor { 

    def receive = { 
    case msg:String => doStuff() 
    case e => _ 
    } 
} 

Répondre

3

Vous êtes absent le signe égal après receive en appelant. Sans cela, la méthode est définie comme renvoyant Unit (c'est-à-dire, aucune valeur utile), et Akka a besoin que vous renvoyiez un PartialFunction[Any,Unit] de la réception.

Maintenant, pour mettre en œuvre effectivement votre logique de la manière idiomatiques, vous voulez probablement utiliser un ReceiveTimeout, comme ceci:

class Caller extends Actor { 
    self.receiveTimeout = Some(1000) 

    def receive = { 
    case ReceiveTimeout => 
     self ! "msg" 
    } 
} 
Questions connexes