2015-02-08 5 views
5

ist es in Akka (Scala) möglich, einen Verweis auf ein vorhandenes ActorSystem zu erhalten?Wie bekomme ich einen Verweis auf ein bestehendes ActorSystem in Akka?

Ich arbeite an einer Sprühanwendung mit einem anderen Akteur für DB. Ich erweitere auch Richtlinien, um ein Objekt pro Pfad zu haben. Die Direktiven sind keine eigenen Akteure, sie müssen jedoch Nachrichten an den DBActor übergeben. hier:

class HttpActor extends Actor with HttpService { 

    val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives{ 
    def route(implicit dm: DetachMagnet2) = { 
    path("hosts") { 
     get { 
     detach() { 
      **dbActor ! CreateHost** 
      complete("get me hosts!") 
     } 
     } ~ 
     post { 
     detach() { 
      entity(as[String]) { payload => 
      complete(s"post hosts $payload")  
      } 
     } 
     } 
    } 
    } 
} 

gibt es eine Möglichkeit für HostsService die ActorSystem selbst zu entdecken, damit er die DBActor finden können oder müssen HttpActor es in geben? Letzteres scheint weniger elegant zu sein, da HostService eine Klasse (kein Objekt) werden muss, also kein Singleton mehr.

Antwort

1

Von here:

gab es ein Ticket, eine solche Registrierung für das Erstellen, aber wir waren nicht zufrieden mit dem, was wir haben, wenn die Semantik in Detail angeben wollen. Ein Teil ist, dass wir alle globalen Zustand entfernt haben, so dass verschiedene Teile einer Anwendung Akka verwenden können, ohne sich um gegenseitig zu kümmern und ein globales Feature würde dies brechen. Eine andere ist, dass es ermutigen würde, get-or-create usage-mein Haustier pisse-was würde die Semantik unklar machen: Sie geben einen Namen und eine Konfiguration, aber wenn der Name bereits existiert Sie möglicherweise wieder ein anders konfiguriert System (was normalerweise ziemlich tödlich ist).

Es gibt nichts, was Sie davon ab, eine hashmap in einem zentralen Ort Ihrer Anwendung zu stoppen, (Vor-) bevölkert, dass mit der Aktorik Sie brauchen, und durchgeführt werden, das ist im Grunde ein Einzeiler (das ist ein andere Grund für die nicht in Akka einschließlich, weil anstelle einer einfachen Lösung zu einem sehr engen Problem, das wir ein viel allgemeineres Problem)

in Ihrem Fall zu denken, eine Lösung zu haben würde, ist es besser, übergeben Sie Ihr System implizit an die route Funktion:

class HttpActor extends Actor with HttpService { 

    implicit val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives { 
    def route(implicit dm: DetachMagnet2, as: ActorContext) = {...} 
} 
+0

das tat es, und gut genug für mich. Jetzt muss ich zu meinem nächsten Problem kommen, weshalb alle Pfade beim Neustart aufgerufen werden, aber wenn ich Adressen anrufe, bekomme ich nur den Listener-Thread, der sagt, dass er eine GET-Anfrage an einen Handler schickt, der aussieht wie ein System-Akteur (.../System/IO-TCP/Selectors/...), und nichts anderes passiert ... –