2015-04-06 15 views
5

Utilizzo un ActorPublisher come Akka-Stream Source. Non riesco a capire come denominare in modo prevedibile l'attore di input in modo da poter inviare messaggi da altre parti della mia applicazione. Sto un'istanza mia fonte in questo modo:C'è un modo per ottenere nomi di attori prevedibili con Akka-Stream?

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

ottengo una ActorRef quando ho materializzare l'torrente, ma il percorso per essa viene generata dinamicamente, e utilizza solo il mio nome fornito come parte di un flusso di codice generato da schema di denominazione centrica.

C'è un modo per avere questa fonte di attore front-end con un nome esplicito o sono bloccato passando l'ActorRef in giro?

Se non riesco a nominarlo esplicitamente, significa che non è possibile utilizzare Akka-Stream direttamente con i servizi remoti?

EDIT: posso trovare il mio attore con relativa pathing ora, ma ho ancora bisogno di capire come il nome della mia Flow così posso capire quale sarà il percorso completo per l'attore in questione.

EDIT: (Akka informazioni sulla versione di seguito, scala 2.11.6)

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

EDIT: Le amichevoli gente sopra a gruppo Akka-utente di Google mi hanno illuminato, e suggeriscono che la corretta il modo per affrontare questo è passando il ActorRef risultante dalla chiamata runWith() e non utilizzando .actorSelection(). Aggiornerò questa domanda se scoprirò che questo stato di cose cambia in futuro. Grazie per aver letto.

risposta

1

Un buon modo per risolvere questo problema è l'aggiunta di un router di gruppo con percorso specifico, quindi è possibile indicare al router dove trovare gli attori (percorsi).

In questo modo si disaccoppierà il gruppo di attori concreto e si manterrà un singolo punto di accesso al pool di origine tramite router. Inoltre, sarai in grado di rendere questo cluster del router consapevole in futuro.

È anche possibile esaminare ActorFlowMaterializer - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer stesso. Potete trovare questo commento nel codice sorgente:

/** 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

Questo è un buon modo per astrarre gli attori, ma quello che ho bisogno è di essere in grado di risolvere gli attori da un percorso. A tale scopo la tua soluzione non è diversa dalla condivisione di ActorRef. Ma buon pensiero a prescindere. –

+1

Un'altra soluzione può essere inviare il messaggio Identify agli attori sotto ActorSelection e ascoltare la risposta di ActorIdentity che conterrà ActorRef. Puoi anche creare un messaggio personalizzato se lo desideri. Per quanto mi ricordo, Flow avrà il tuo nome come prefisso, come task-listener *. – YoK

+0

Per quanto riguarda i nomi, se si utilizza ActorFlowMaterializer, è possibile vedere come vengono denominati gli attori e si controlla il prefisso di questi attori fornendo il proprio prefisso personalizzato a Materializer stesso. Guarda qui per maggiori informazioni - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer. – YoK

Problemi correlati