2012-05-11 8 views
5

Si creo un actor usando context(). ActorOf() en Akka, obtengo un ActorRef válido. Sin embargo, si hago lo mismo, pero creo un ActorRef usando actorFor y la ruta que sé que aparecerá el actor, no obtengo un ActorRef válido de manera confiable. ¿Cómo puedo decir que un actor ha sido registrado con éxito?En Akka, ¿cómo sé cuándo un actor está listo para usar después de haber sido registrado con actorOf()?

En la descripción anterior, podría simplemente usar el ActorRef devuelto por actorOf(). Sin embargo, en mi caso real, creo un actor que registra a un actor secundario y necesito resolverlo, por lo que el problema en general es "¿cómo puedo esperar/registrarme para estar informado de que un actor se ha registrado en una ruta conocida? ".

Respuesta

1

Antes que nada, no hay garantía de que el ActorRef que recuperas de actorOf aún esté vivo, ya que el constructor del mismo podría haber fallado.

En segundo lugar, actorPuede encontrar al actor pero murió justo después de ser encontrado y justo antes de que comenzaras a trabajar con él.

En tercer lugar, normalmente es una buena práctica estructurar su aplicación para que las dependencias se propaguen de manera lógica, de modo que exista un punto de encuentro natural entre sus actores.

Esperanza cualquiera de las anteriores ayudas,

feliz hAkking!

+1

De acuerdo en los dos primeros puntos, es posible que el actor nunca haya estado allí y se haya ido antes de que tuviera la oportunidad de usarlo. En el primero, supongo que lo que realmente estoy buscando es cómo cargar correctamente un sistema basado en actores. ¿Debo preguntarle a() un actor que representa un subsistema usando un mensaje de inicio para asegurarse de que él y sus subsistemas a su vez estén listos? – SoftMemes

+0

Crea tu sistema como un gráfico de Actores. Luego puede usar una combinación de DeathWatch y eventStream del sistema para publicar vivo/muerto. Sería interesante tener un LifeWatch también. Pero el riesgo es que perderá memoria si el actor nunca cobra vida. –

+0

al usar akka.testkit, usted envía un mensaje al actor inmediatamente instanciado ... necesita una forma de saber que está listo ... – KitAndKat

7

Desde Akka 2.2.1 se puede utilizar para obtener una ActorSelection.resolveOne ActorRef a partir de una selección de los agentes:

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

De los documentos http://doc.akka.io/api/akka/2.2.1/index.html#akka.actor.ActorSelection

Resolver el juego ActorRef esta selección El resultado se devuelve como un futuro que se completa con ActorRef si existe tal actor . Se completa con la falla ActorNotFound si no existe tal actor o la identificación no se completó dentro del tiempo de espera proporcionado .

Debajo del capó se habla con el actor al verificar su existencia y adquirir su ActorRef.

Cuestiones relacionadas