scala - ¿Pasar ActorRef a otros actores es bueno o malo?
design-patterns akka (2)
Estoy tratando de averiguar si mi uso de pasar Akka ActorRef
a otros actores no es un anti-patrón.
Tengo algunos actores en mi sistema. Algunos son longevos ( restClientRouter
, publisher
) y algunos mueren después de haber realizado el trabajo ( geoActor
). Los actores de corta duración deben enviar mensajes a los actores de larga duración y, por lo tanto, necesitan sus ActorRef
s.
//router for a bunch of other actors
val restClientRouter = createRouter(context.system)
//publishers messages to an output message queue
val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")
//this actor send a message to the restClientRouter and then sends the response
//to the publisher
val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")
Como puede ver, estoy pasando ActorRefs ( restClientRouter
y publisher
) al constructor de GeoInferenceActor
. ¿Está bien o no? ¿Hay una mejor manera de hacer esto?
Es perfectamente válido, como se indica en la documentación de Akka API :
ActorRefs se puede compartir libremente entre los actores mediante el paso de mensajes.
En su caso, se los pasa a los constructores, lo cual es absolutamente correcto y se supone que debe ser así.
Hay un par de buenas maneras de "presentar" referencias de actores a instancias de actores que los necesitan.
1) Cree el actor con los refs que necesita como argumentos de constructor (que es lo que está haciendo)
2) Pase los refs necesarios con un mensaje después de crear la instancia
Su solución es perfectamente aceptable, e incluso sugerida por Roland Kuhn, el Líder Técnico de Akka, en este post: