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.
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
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à". –
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