J'ai mis en place un trait d'écoute / auditeur pouvant être ajouté aux acteurs. Je me demande s'il est possible d'attacher ce style de trait à un acteur sans avoir à appeler explicitement la méthode listierserhandler em> Je m'attendais également à trouver cette fonctionnalité dans la bibliothèque Akka. Est-ce que je manque quelque chose ou y a-t-il une raison pour que Akka n'inclut pas cela? P>
5 Réponses :
Pourquoi ne pas étendre vous remplacerait alors acteur code> directement, ou si vous souhaitez que les non-acteurs soient également écoudies, créez un livetableactor qui prolonge l'acteur avec écoute? P>
recevoir code> dans acteur comme vous avez déjà fait (sauf que vous souhaitez appeler
super.receive code> aussi, n'est-ce pas? - Vous voulez simplement modifier la fonction qui est transmise). P>
Eh bien, c'est la chose, dans les deux situations, je devrais vous rappeler d'appeler SUPER.Receive ou ListenerHanlder I>. Je me demandais s'il y avait un mécanisme de Scala en général ou dans l'une quelconque des bibliothèques d'acteurs qui ont permis à l'acteur de mettre en œuvre la mise à l'écoute pour ne pas avoir à faire quoi que ce soit, sauf dire: avec écoute lisible i>
Mais vous devrez seulement dire étend listibleAsctor code> au lieu de
étend acteur code>; INTÉRIEUR
LIADIBABLEEACTOR CODE> Vous auriez déjà remplacé par
Recevoir code> (et, vraisemblablement,
recevoirwithin code>). Voir aussi la réponse de Daniel.
Je vous suggère d'étendre l'acteur et d'utiliser un Résumé de remplacement code>. P>
Voici une solution (version modifiée de l'exemple de Début Scala):
import se.scalablesolutions.akka.actor.Actor case class AddListener(who: Actor) case class RemoveListener(who: Actor) class ListenableActor extends Actor { private var listeners: List[Actor] = Nil def receive = { case AddListener(who) => listeners ::= who case RemoveListener(who) => listeners.filter(_ ne who) } protected def notifyListeners(event: Any) = { listeners.foreach(_.send(event)) } } class ImplementingActor extends ListenableActor { override def receive = { super.receive orElse { case Message(content) => println(content) } } }
Pourquoi n'ai-je pas vu cette question auparavant, erm, bien, mieux vaut tard que jamais: p>
http://doc.akka.io/docs/akka /snapshot/scala/Routing.html p>
Il y a un support intégré à cela dans AKKA: https://github.com/jboner/akka/blob/release-1.2/akka-actor/akka/main/scala/akka/route/listeners.scala p>