8
votes

Composition des acteurs

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

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? xxx


0 commentaires

5 Réponses :


5
votes

Pourquoi ne pas étendre acteur directement, ou si vous souhaitez que les non-acteurs soient également écoudies, créez un livetableactor qui prolonge l'acteur avec écoute?

vous remplacerait alors recevoir dans acteur comme vous avez déjà fait (sauf que vous souhaitez appeler super.receive aussi, n'est-ce pas? - Vous voulez simplement modifier la fonction qui est transmise).


2 commentaires

Eh bien, c'est la chose, dans les deux situations, je devrais vous rappeler d'appeler SUPER.Receive ou ListenerHanlder . 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


Mais vous devrez seulement dire étend listibleAsctor au lieu de étend acteur ; INTÉRIEUR LIADIBABLEEACTOR Vous auriez déjà remplacé par Recevoir (et, vraisemblablement, recevoirwithin ). Voir aussi la réponse de Daniel.



2
votes

Je vous suggère d'étendre l'acteur et d'utiliser un Résumé de remplacement .


0 commentaires

0
votes

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)
        }
    }
}


0 commentaires

2
votes

Pourquoi n'ai-je pas vu cette question auparavant, erm, bien, mieux vaut tard que jamais:

http://doc.akka.io/docs/akka /snapshot/scala/Routing.html


0 commentaires

0
votes