2015-02-08 34 views
5

jest to możliwe w Akka (scala), aby uzyskać odniesienie do istniejącego ActorSystem?Jak uzyskać odniesienie do istniejącego ActorSystem w Akka?

Pracuję nad aplikacją Spray z innym Aktorem dla DB. Rozszerzam także dyrektywy, by mieć obiekt na ścieżkę. dyrektywy nie są aktorami same w sobie, ale muszą przekazywać wiadomości do DBActor. tutaj:

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

czy istnieje sposób na HostsService odkryć samego ActorSystem aby mógł znaleźć DBActor lub musi HttpActor przekazać go w? ten ostatni wydaje się mniej elegancki, ponieważ HostsService będzie musiał stać się klasą (nie obiektem), więc nie będzie już singletonem.

Odpowiedz

1

Od here:

był bilet na stworzenie takiego rejestru, ale nie byli zadowoleni z tego, co mamy, gdy próbuje określić semantykę w szczegółach. Jedną z części jest to, że usunęliśmy cały stan globalny, aby różne części aplikacji mogły korzystać z Akki, nie martwiąc się o siebie nawzajem, a funkcja globalna złamałaby to. Innym jest to, że zachęciłoby to do użycia get-or-create - mojego pupila - co spowodowałoby, że semantyka była niejasna: podajesz nazwę i konfigurację, ale jeśli już istnieje nazwa , potencjalnie otrzymujesz inny skonfigurowany system (co zwykle jest dość fatalne).

Nie ma nic Cię powstrzymuje od oddanie HashMap w jakimś centralnym miejscu aplikacji (wstępnie) zapełnić że z systemami aktor trzeba i być zrobione, to w zasadzie jedno-liner (co jest kolejnym powodem nie włączając go w Akce, bo zamiast prostego rozwiązania do bardzo wąskiego problemu musielibyśmy myśleć o rozwiązanie znacznie bardziej ogólny problem)

w twoim przypadku, to lepiej przekaż swój system niejawnie do funkcji route:

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

który to zrobił i wystarczająco dobry dla mnie. Teraz muszę przejść do następnego problemu, dlatego wszystkie ścieżki wydają się być wywoływane przy ponownym uruchomieniu, ale kiedy wywołuję adresy, wszystko, co otrzymuję, to wątek odsłuchiwania mówiąc, że wysyła żądanie GET do programu obsługi, który wygląda jak aktor systemowy (.../system/IO-TCP/selektory/...) i nic więcej się nie dzieje ... –