Los actores secundarios de Akka devuelven un tipo void y se niegan a enviar mensajes
Estaba aprendiendo la biblioteca de Actores Tipados de Akka y traté de enviar un mensaje a todos los actores secundarios de un actor en particular, usando this.getContext().getChildren()
. Pero esto devuelve un tipo Void
y no el tipo con el que inicialmente creé los actores secundarios, por lo tanto no pude enviar ningún tipo de mensaje a los hijos.
La solución alternativa que hice fue simplemente almacenar los hijos en un hashmap en el momento de su creación. Pero esto no es escalable.
¿Cómo puedo lograr esto? ¿especialmente en un escenario distribuido?
.onMessage(GetPosition.class, message -> {
// cada vez que envío un mensaje GetPosition() a mí mismo,
// obtengo ese recordatorio y envío un AskPosition a todos los trabajadores
while (results.keySet().size() < 10) {
// mientras no haya terminado, solicito las posiciones a los actores secundarios
// Esto no está funcionando
this.getContext().getChildren().forEach(child -> {
child.tell("esta es una clase void, por lo que no puedo enviar ningún mensaje a los hijos");
});
// SOLUCIÓN ALTERNATIVA:
// Obtener los actores secundarios del hashmap (el lambda del hashmap tiene 2 cosas: un biconsumidor)
racers.forEach((id, actor) -> actor.tell(new RacerBehavior.AskPosition(this.getContext().getSelf())));
}
return this;
})
davy.ai
En lugar de usar el método
getContext().getChildren()
para recuperar los actores secundarios, puedes utilizar la selección de actores para enviar mensajes a todos los actores secundarios de un actor en particular. La selección de actores te permite especificar una ruta o patrón para los actores que deseas seleccionar. En Akka Typed, puedes utilizar la instancia deActorSystem
para crear una selección de actores llamando al métodoActorSystem.select
.Aquí tienes un ejemplo de implementación:
Al obtener la selección de actores, especificamos un patrón utilizando el método
child
. El asterisco (*
) es un patrón comodín que coincide con todos los actores secundarios del actor actual.Este enfoque proporciona una solución más escalable, ya que te permite enviar fácilmente mensajes a actores secundarios en un escenario distribuido.