2012-09-21 4 views
1

mon environnement est scala akka et le jeu! cadre. Je me demandais s'il y avait de toute façon à contrôler la création d'un système d'acteur ou d'autres idées qui le peuvent.Akka ActorSystem Control

Mon idée est de créer des acteurs distants qui géreront l'autorisation lorsqu'un utilisateur clique sur acheter. Et donc, je crée le système d'acteur à distance et les acteurs dans une méthode d'action, lorsqu'un utilisateur fait un message:

def payment = Action { implicit request => 
    var actorObject: Array[String] = new Array[String](23) 

    val system = ActorSystem("RemoteSystem", ConfigFactory.load.getConfig("remotecreation") 

    val worker = system.actorOf(Props[authNetActor.AuthNetActorMain].withRouter(FromConfig()), name = "remoteActor") 
    ... 
    system.shutdown() 
} 

Voici la définition de remotecreation dans le application.conf

remotecreation {  #user defined name for the configuration 
    include "common" 
    akka { 
      actor { 
        serialize-messages = on 
        serialize-creators = on 

        serializers { 
          proto = "akka.serialization.ProtobufSerializer" 
          java = "akka.serialization.JavaSerializer" 
          arr = "models.ArraySerializer" 
        } 

        serialization-bindings { 
          "com.google.protobuf.Message" = proto 
          "java.lang.String" = java 
          "java.util.Arrays" = java 
          "scala.Array" = arr 
          "akka.actor.ActorRef" = java 
        } 

        deployment { 
          /remoteActor { #Specifically has to be the name of the remote actor 
            remote = "akka://[email protected]:2552" 
            router = "round-robin" 
            nr-of-instances = 1 
          } 
        } 
      } 
      remote.netty.port = 2554 
    } 
} 

Le problème Je l'ai, c'est que, lorsque je le soumets deux fois de suite, j'obtiens une erreur parce que j'essaie de créer un système d'acteur sur une adresse IP qui a déjà un système d'acteur.

Je pense vraiment que je dois le déplacer, mais je ne suis pas sûr d'où, parce que cela va être un jeu multi-utilisateur! application, je ne suis pas sûr où je peux mettre la création du système d'acteur sans être en conflit lorsque des centaines d'utilisateurs utilisent l'application.

Toute idée, suggestion ou aide est appréciée.

Répondre

3

Ne démarrez pas un ActorSystem (distant) par appel. Au lieu de cela, démarrez un système d'acteur à l'échelle de l'application (ou utilisez celui par défaut, voir integrating Play with Akka).

Ajouter à votre application.conf:

akka { 

    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 

    remote { 
    transport = "akka.remote.netty.NettyRemoteTransport" 
    netty { 
     hostname = "127.0.0.1" 
     port = 0 # 2552 seems to be bound with play 2.0.2 ? 
    } 
    } 
} 

utiliser la valeur par défaut Jouer actorsystem par exemple pour obtenir une référence à l'acteur à distance dans votre contorller:

private val interpreters = Akka.system.actorFor(
    "akka://[email protected]:2552/user/interpreters") 

Vous pouvez même convertir un Akka avenir à une promesse Scala si vous voulez rendre la réponse de l'acteur. Je suis heureux de continuer à utiliser Akka Futures pour la composabilité, puis à la toute dernière racine convertir le Future[Result] en une promesse.

new AkkaPromise(
    interpreters.ask(InterpretersComm.Request(sid, line)).mapTo[String]) map (Ok(_)) 
+0

Les exemples proviennent d'un projet de mine de mes compagnons utilisant des interprètes scala à distance. – ron

Questions connexes