2013-03-17 3 views
0

J'utilise le nouvel Akka IO et j'ai suivi ce tutorial (qui est une simple application serveur-client). Mon code de système d'acteur du serveur ressemble à ceci:akka io serveur tcp

// create the sever system 
    ActorSystem tcpServerSystem = ActorSystem.create("tcp-server-system"); 


    // create the tcp actor 
    final ActorRef tcpServer = Tcp.get(tcpServerSystem).manager(); 

    // create the server actor; 
    ActorRef serverActor = tcpServerSystem.actorOf(new Props(ServerActor.class).withRouter(new RoundRobinRouter(5)), "server"); 

    // tell the tcp server to use an actor for listen connection on; 
    final List<Inet.SocketOption> options = new ArrayList<Inet.SocketOption>(); 
    options.add(TcpSO.reuseAddress(true)); 

    tcpServer.tell(TcpMessage.bind(serverActor, new InetSocketAddress("127.0.0.1", 12345), 10, options), 
      serverActor); 

Le ServerActor classe, il est juste un acteur clair que sur son OnReceive fait ce qui suit:

logger.info("Received: " + o); 
    if (o instanceof Tcp.Connected){ 
     connectionActor = getSender(); 
     connectionActor.tell(TcpMessage.register(getSelf()), getSelf()); 
     ByteStringBuilder byteStringBuilder = new ByteStringBuilder(); 
     byteStringBuilder.putBytes("Hello Worlds".getBytes()); 
     connectionActor.tell(TcpMessage.write(byteStringBuilder.result()), getSelf()); 
    } 

Je suis en train de tester le serveur acteur utilisant netcat et avoir ce comportement "étrange": seul le premier client qui se connecte au serveur reçoit le message envoyé par le serveur. Les clients nexts peuvent se connecter au serveur mais ne reçoivent pas le message. En mode de débogage, le serveur ne reçoit pas non plus le message Tcp.Connected (sauf pour le premier client connecté), donc un message d'enregistrement n'a pas pu être envoyé au client, bien que les clients suivants puissent se connecter.

Répondre

1

Ceci est un problème connu dans le jalon 2.2-M1, où le problème était que le TcpListener n'a pas enregistré AcceptInterest sur le sélecteur à moins qu'il n'atteigne le BatchAcceptLimit configuré, ce qui l'empêche de recevoir de nouveaux seulement quelques connexions en attente.

Il a été corrigé et fera partie de la prochaine mise à jour.

+0

Merci pour la réponse. Je soupçonnais que les problèmes sont liés au sélecteur NIO. J'attends la prochaine étape. – dumitru

+0

Il est déjà sorti: https://groups.google.com/forum/?fromgroups=#!topic/akka-user/lRXIHNP1614 –

+0

Merci Viktor pour le lien. J'ai testé avec le nouveau jalon et tout va bien. Maintenant, j'ai reveiced tous les événements nécessaires. – dumitru