2011-03-16 5 views
2

J'ai eu un petit problème. Je viens de déplacer la communication client-serveur de mon projet en cours de Scala Actors à distance vers Akka Actors. Tout a bien fonctionné pendant les tests sur ma machine locale mais une fois que j'ai essayé d'exécuter le code avec le client et le serveur sur différentes machines, le client ne peut plus accéder au serveur (java.nio.channels.NotYetConnectedException). Je double et tripple vérifié l'ip et le port utilisé. Ce sont les mêmes données d'hôte que j'ai utilisées dans le code avec les acteurs de Scala (qui d'ailleurs fonctionnent toujours, donc apparemment rien n'a changé aux paramètres du pare-feu et le serveur est techniquement joignable)Acteur Akka ne peut pas se connecter au serveur distant où Scala Actor pourrait

Voici les parties importantes du code (qui Je copie la plupart du temps collé de la page d'accueil de Akkas):

sur l'acteur serveur

import akka.actor.Actor._ 
import akka.actor.{Actor, ActorRef, Supervisor} 

override def preStart = { 

    // I also tried the servers external ip here 
    remote.start(host, 1357) 

    // SERVER_SERVICE_NAME is a string constant in a trait that both server 
    // and client extend 
    // all actual work is refered to SessionActor 
    remote.registerPerSession(SERVER_SERVICE_NAME, actorOf[SessionActor]) 
} 

et sur le client:

import akka.actor.Actor._ 
import akka.actor.{Actor, ActorRef, Supervisor} 

override def preStart = { 

    // CLIENT_SERVICE_NAME is a string constant 
    Actor.remote.start("localhost", 5678).register(CLIENT_SERVICE_NAME, self) 

    // I also tried "Thread sleep 1000" here just in case 

    // internalServer is a private var of the type Option[ActorRef] 
    // host and serverPort are actually read from a propertiesfile. Guess this 
    // doesn't matter. I checked them. 
    internalServer = Some(
    remote.actorFor(SERVER_SERVICE_NAME, host, serverPort) 
) 

    // Again I tried "Thread sleep 1000" here. Didn't help neither 

    internalServer foreach (server => { 
    (server !! Ping) foreach (_ match { // !!! this is where the exception is thrown !!! 
     case Pong => println("connected") 
     case _  => println("something's fishy") 
     }) 
    }) 

} 

J'utilise: Scala 2.8.1 (bien que je ne suis pas sûr que les machines à mon client sont 2.8 ou 2.8.1, j'utilise le scala-library.jar de la distribution de akka) 1.0 Akka

Je sais que vous pouvez Ne débugg mon code mais je serais très reconnaissant pour n'importe quel genre d'idée ou d'idée ce qui pourrait mal se passer ici.

P.S .: l'exception est lancée dans une fraction de seconde après avoir essayé d'envoyer le Ping. Donc je n'ai pas pris la peine d'augmenter le temps d'attente.

Répondre

4

DISCLAIMER: Je suis le bon de commande de Akka

Essayez d'utiliser une adresse IP brute au lieu d'un nom d'hôte dans remote.start(), si cela ne résout pas vous avez 2 options:

  1. Assurez-vous que les deux parties peuvent résoudre DNS eachother
  2. Mise à niveau vers maître actuel (1,1-snapshot), depuis j'ai fait quelques changements à éviter la résolution de noms.

Cela aide-t-il?

+1

salut Viktor, merci pour votre temps. Quel 'remote.start()' voulez-vous dire? Dans le serveur, j'ai essayé "localhost" et "127.0.0.1" ainsi que l'adresse IP externe. Dans le client, j'utilise en fait "localhost". J'essaierai. En ce qui concerne l'utilisation de la version 1.1: est-elle raisonnablement stable? Malheureusement, je ne peux que vous fournir des commentaires vendredi, car c'est la première fois que je peux envoyer un nouveau code à mon client. – Agl

+0

Comme je m'y attendais, il va essayer de faire une recherche inversée. Je pense que vous êtes mieux d'essayer 1.1-SNAPSHOT, nous allons sortir le RC1 dans une semaine ou deux, donc c'est "presque là". –

+0

merci Viktor. J'ai essayé de compiler 1.1 (maître d'origine) comme décrit sur votre site Web et échoué (semble être un problème avec scala 2.7 vs 2.8). Et mon client voulait son produit hier (littéralement;)). J'ai donc peur que l'attente ne soit pas une option. Je suppose que je devrais rétrograder à des acteurs de scala normaux. Mais je vais essayer de mettre à jour à nouveau pendant les premiers voeux de changement de mes clients. Triste. Mais merci pour votre aide. – Agl

Questions connexes