2012-05-11 20 views
5

Jeśli tworzę aktora za pomocą context(). ActorOf() w Akka, otrzymuję prawidłowy ActorRef. Jeśli jednak zrobię to samo, ale utworzę ActorRef za pomocą actorFor i ścieżkę, którą znam, w której pojawi się aktor, nie otrzymam rzetelnego ActorRef z powrotem. Jak mogę stwierdzić, że aktor został pomyślnie zarejestrowany?W Akka, skąd mam wiedzieć, kiedy aktor jest gotowy do użycia po zarejestrowaniu w actorOf()?

W powyższym opisie, może po prostu używać ActorRef zwrócone od actorOf(). Jednak w moim przypadku tworzę aktora, który sam rejestruje aktora dziecka i muszę to rozwiązać, więc ogólnie rzecz biorąc, problem polega na tym, "jak mogę poczekać/zarejestrować się, aby być poinformowanym o aktorze, który został zarejestrowany na znanej ścieżce? ".

Odpowiedz

1

Przede wszystkim, nie ma gwarancji, że ActorRef wrócisz z actorOf jest wciąż żywa, ponieważ konstruktor może to nie udało.

drugie, actorFor może znaleźć aktora, ale zmarł po prostu znaleźć i właśnie zanim rozpoczął pracę z nim.

Po trzecie, zwykle dobrą praktyką jest skonstruowanie aplikacji, aby zależności były propagowane w logiczny sposób, tak aby istniał naturalny punkt rendez-vous między aktorami.

Nadzieja którekolwiek z powyższych pomaga,

szczęśliwy hAkking!

+1

Uzgodnione na dwóch pierwszych punktach, aktor może nigdy nie był tam i może odszedł, zanim masz szansę go użyć. Po pierwsze, domyślam się, że to, czego naprawdę szukam, to jak prawidłowo uruchomić system oparty na aktorach. Czy powinienem zapytać() aktora reprezentującego podsystem za pomocą komunikatu Start, aby upewnić się, że on i jego podsystemy są z kolei gotowe? – SoftMemes

+0

Utwórz swój system jako wykres Aktorów. Następnie możesz użyć kombinacji DeathWatch i systemu eventStream, aby opublikować alive/death. Byłoby interesujące mieć także LifeWatch. Istnieje jednak ryzyko, że wycieknie z pamięci, jeśli aktor nie ożyje. –

+0

podczas korzystania z pliku akka.testkit, wysyłasz wiadomość do natychmiastowego aktora. Potrzebujesz sposobu, aby wiedzieć, że jest gotowy ... – KitAndKat

7

Od Akka 2.2.1 można użyć ActorSelection.resolveOne uzyskać ActorRef z wyborem aktora:

implicit val timeout = Timeout(5, TimeUnit.SECONDS) 
val selection = system.actorSelection("/user/myActor") 
val actor = Await.result(selection.resolveOne(), timeout.duration) 

Od docs http://doc.akka.io/api/akka/2.2.1/index.html#akka.actor.ActorSelection

Resolve dopasowanie ActorRef ten wybór. Wynik jest zwracany jako wynik, który jest zakończony z ActorRef , jeśli taki aktor istnieje. Jest on zakończony niepowodzeniem ActorNotFound, jeśli nie istnieje taki aktor lub identyfikacja nie zakończyła się w ramach podanego limitu czasu wynoszącego .

Pod maską mówi aktorowi o numerze weryfikując jego istnienie i nabyć jego ActorRef.

Powiązane problemy