2013-04-14 11 views
12

Ich bin verwirrt, wie sicherzustellen, dass meine Akteure die entsprechenden Abhängigkeiten mit dem Kuchen Muster haben. Ich komme immer noch damit klar und kann nirgends Beispiele finden. Ich bin im Grunde nur auf der Suche nach einem Tutorial/Ressource zu folgen.Akka und Kuchen Muster

Prost, Chris.

Antwort

10

Schauspieler als Abhängigkeit:

trait DBComponent { 
    def db: ActorRef // no compile time guarantees 

    type K 
    type V 

    object DBActor { 
     case class Put(key: K, value: V) 
     case class Get(key: K) 
    } 

    class DBActor { 
     import DBActor._ 
     val db = scala.collection.mutable.Map.empty[K, V] 
     def receive = { 
     case Put(k, v) => db.put(k, v) 
     case Get(k) => sender ! db.get(k) 
     } 
    } 
} 

trait ServiceComponent { 
    this: DBComponent => 

    import DBActor._ 

    // you could be talking to deadLetters for all you know 
    def put(k: K, v: V): Unit = db ! Put(k, v) 
    def get(k: K): Option[V] = { 
     implicit val timeout = Timeout(5 seconds) 
     val future = ask(actor, Get(k)).mapTo[Option[V]] 
     Await.result(future, timeout.duration) 
    } 
} 

Schauspieler Abhängigkeiten (wo nichts Besonderes es ist):

trait DBComponent { 
    def db: DB 

    type K 
    type V 

    trait DB { 
     def put(key: K, value: V): Unit 
     def get(key: K): Option[V] 
    } 
} 

trait ServiceComponent { 
    this: DBComponent => 

    object ServiceActor { 
     case class Put(key: K, value: V) 
     case class Get(key: K) 
    } 

    class ServiceActor { 
     import ServiceActor._ 
     def receive = { 
     case Put(k, v) => db.put(k, v) // db is in scope 
     case Get(k) => sender ! db.get(k) 
     } 
    } 
} 
+1

Was andersrum Dinge, keine Schauspieler als Abhängigkeiten aufweisen, sondern Akteure Abhängigkeiten, das ist, was ich denke, die OP fragt Über. –

+0

Thx für das hinweisend. Ich habe meine Antwort aktualisiert. – agilesteel

+1

Aber mein Problem ist, dass, wenn ServiceActor eine Nachricht an OtherServiceActor übergeben muss, die Standardmethode, die ich lese, scheint, die Methode "context.actorOf [OtherServiceActor]" zu verwenden, um den erforderlichen Akteur zu erstellen. An diesem Punkt erhalte ich Fehler, wenn der OtherServiceActor in ein Merkmal eingepackt ist, da er nicht in diesem Bereich instanziiert werden kann. – Owen

2

Eine weitere Gotcha, wie Owen wies darauf hin, dass die Schaffung Akteure mit actorOf(Props[MyClass]) funktioniert nicht für innere Klassen. Dh: die folgenden fehl:

trait MyComponent { 
    class MyActor { 
    def receive = ... 
    } 
} 

new MyComponent { 
    val myActorRef = system.actorOf(Props[MyActor]) 
} 

Gemäß der Dokumentation bei http://doc.akka.io/docs/akka/snapshot/scala/actors.html,

wenn sie innerhalb eines Objekt der obersten Ebene nicht deklariert werden dann die umschließende Instanz ist das Referenz übergeben werden muss, wie Das erste Argument

Dies wird jedoch von den Signaturen der scaladoc Props-Methode nicht unterstützt. Der einzige Weg, den ich fand, war, den Konstruktor Props (actor: Actor) zu verwenden, den Akteur mysql zu instanziieren und ihn an Props zu übergeben.

val myActorRef = system.actorOf(Props(new MyActor(arg1, arg2))) 

wäre daran interessiert, zu wissen, ob es ein besserer Weg, ..

+1

Sie könnten actorOf (Props (classOf [SomeActor], someArgument)) verwenden. –