W poprzednim poście użyliśmy metody ActorSelection w celu uzyskania referencji do aktora:
var actor1 = system.ActorSelection("/user/ApplicationUserControllerActor/Piotr")
Dzisiaj chciałbym bardziej skupić się na definiowaniu ścieżki do aktora. Pełna ścieżka może zawierać następujące elementy:
– protokół
– nazwa systemu
– adres ip aktora
– seria nazw aktorów opisująca hierarchie np. ApplicationUserControllerActor/actor1/actor2 itp.
Załóżmy, że nasz aktor znajduje się na innym komputerze. Oznacza to, aby wysłać jakieś wiadomości do niego musimy skorzystać z protokołu sieciowego. Nazwa ścieżki będzie wtedy wyglądać:
akka.tcp://FooHierarchySystem@89.124.43.14/user/ApplicationUserControllerActor/Piotr
Jeśli nie korzystamy ze zdalnych aktorów, wtedy moglibyśmy napisać:
akka://FooHierarchySystem/user/ApplicationUserControllerActor/Piotr
W poprzednim poście jednak nie musieliśmy podawać nazwy systemu (FooHierarchySystem). Wynika to z faktu, że akka .net wspiera ścieżki relatywne. ActorSlection wywoływaliśmy bezpośrednio na systemie, zatem nie było potrzeby precyzowania tego w ścieżce. Można to porównać do ścieżek relatywnych występujących w systemie plików.
Załóżmy, że jesteśmy teraz w aktorze ApplicationUserControllerActor i hierarchia jest taka sama jak w poprzednim wpisie:
W celu uzyskania dostępu do jednej z instancji ApplicationUserActor możemy:
// Pierwsze podejście Context.ActorSelection("akka://FooHierarchySystem/user/ApplicationUserControllerActor/Piotr"); // Drugie podejście Context.ActorSelection("user/ApplicationUserControllerActor/Piotr"); // Trzecie podejście Context.ActorSelection("Piotr");
Wszystkie ścieżki wskazują na tego samego aktora, a dwie ostatnie są relatywne. Podobnie z ApplicationUserControllerActor możemy:
Context.ActorSelection("../../ApplicationUserControllerActor").Tell(new AddUser("AnotherUser"));
Tak jak w ścieżkach systemu plików, ../ oznacza wejście o jeden poziom do góry. W powyższym przykładzie ../../ da nam referencję na /user, a potem schodzimy z powrotem na ApplicationUserControllerActor.