2015-04-06 13 views
5

Używam ActorPublisher jako Akka-Stream Source. Nie wiem, jak przewidzieć nazwę aktora wejściowego, aby móc wysyłać wiadomości z innych części aplikacji. Mam instancji moje źródło tak:Czy istnieje sposób na uzyskanie przewidywalnego nazewnictwa aktorów za pomocą Akka-Stream?

val src = Source[Task](Props(classOf[TaskListener], this), "task-listener") 

dostaję ActorRef kiedy zmaterializować strumień, ale droga do niego jest generowana dynamicznie, i to tylko pod warunkiem wykorzystuje moje nazwisko jako część przepływu kodów generowanych -centryczny schemat nazewnictwa.

Czy jest jakiś sposób na to, aby to frontowe źródło aktora miało jednoznaczne imię lub czy utknąłem, przekazując ActorRef?

Jeśli nie mogę jednoznacznie nazwać tego, oznacza to, że nie można używać programu Akka-Stream bezpośrednio z programem zdalnego sterowania?

EDIT: mogę znaleźć aktora za pomocą względnego pathing teraz, ale nadal muszę dowiedzieć się, jak nazwać mój Flow więc mogę zrozumieć, co pełna ścieżka do aktora w pytaniu będzie.

EDIT: (wersja Akka informacji poniżej, scala 2.11.6)

"com.typesafe.akka" %% "akka-actor" % "2.3.9" 
"com.typesafe.akka" %% "akka-stream-experimental" % "1.0-M4" 

EDIT: Sympatyczni ludzie nad na grupy google Akka użytkownik nie oświecił mnie, i sugerują, że właściwe sposobem radzenia sobie z tym jest omijanie numeru ActorRef, który wynika z samego połączenia runWith() i nie jest używany .actorSelection(). Zaktualizuję to pytanie, jeśli stwierdzę, że ten stan rzeczy ulegnie zmianie w przyszłości. Dziękuje za przeczytanie.

Odpowiedz

1

Dobrym sposobem na rozwiązanie tego problemu będzie dodanie routera grupowego z określoną ścieżką, a następnie możesz wskazać routerowi, gdzie może znaleźć twoich aktorów (trasy).

W ten sposób odłączysz grupę konkretnego aktora i utrzymasz pojedynczy punkt wejścia do puli źródeł za pośrednictwem routera. W przyszłości będzie można również utworzyć ten klaster routera.

Możesz również zajrzeć do ActorFlowMaterializer - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer sam. Możesz znaleźć ten komentarz w kodzie źródłowym:

/** The `namePrefix` is used as the first part of the names of the actors running 
    * the processing steps. The default `namePrefix` is `"flow"`. The actor names are built up of 
    * `namePrefix-flowNumber-flowStepNumber-stepName`. 
    */ 
def create(settings: ActorFlowMaterializerSettings, context: ActorRefFactory, namePrefix: String): ActorFlowMaterializer = 
apply(Option(settings), Option(namePrefix))(context) 
+0

To jest dobry sposób na abstrakcję aktorów, ale potrzebuję tego, aby móc odseparować aktorów od ścieżki. W tym celu Twoje rozwiązanie nie różni się od udostępniania ActorRef. Ale dobre myślenie niezależnie. –

+1

Innym rozwiązaniem może być wysyłanie wiadomości identyfikującej do aktorów w sekcji ActorSelection i słuchanie odpowiedzi ActorIdentity, która będzie zawierać ActorRef. Możesz również utworzyć niestandardową wiadomość, jeśli chcesz. O ile dobrze pamiętam, Flow będzie mieć twoje imię, takie jak prefiks, podobnie jak task-listener *. – YoK

+0

Także jeśli chodzi o nazywanie, jeśli używasz ActorFlowMaterializer, możesz zobaczyć, jak nazywa się aktorów, i kontrolujesz prefiks tych aktorów, podając swój własny prefiks do samego Materializera. Zajrzyj tutaj, aby uzyskać więcej informacji - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer. – YoK

Powiązane problemy