es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;
})
Tags:  , ,

Answer

  1. Avatar for 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 de ActorSystem para crear una selección de actores llamando al método ActorSystem.select.

    Aquí tienes un ejemplo de implementación:

    // obtén una selección de actores para todos los actores secundarios de este actor
    ActorSelection childActorSelection = context.getSystem().select(context.getSelf().path().child("*"));
    
    // envía un mensaje a todos los actores secundarios
    childActorSelection.tell(new MyMessage());
    
    // también puedes utilizar el patrón ask para obtener las respuestas de los actores secundarios
    CompletionStage<myresponse> response = AskPattern.ask(
      childActorSelection,
      MyMessage::new,
      Duration.ofSeconds(5),
      context.getSystem().scheduler()
    );
    

    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.

Comments are closed.