scala design-patterns akka actor anti-patterns

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:

Búsqueda de actor Akka o inyección de dependencia