Akka Actor не может подключиться к удаленному серверу, на котором мог Scala Actor - PullRequest
2 голосов
/ 16 марта 2011

У меня маленькая проблема. Я только что перевел связь клиент-сервер моего текущего проекта с удаленных актеров Scala на удаленных актеров Akka.

Все работало нормально при тестировании на моей локальной машине, но как только я попытался запустить код с клиентом и сервером на разных машинах, клиент больше не может получить доступ к серверу (я получаю java.nio.channels.NotYetConnectedException). Я дважды и трижды проверил IP и используемый порт. Это те же самые данные хоста, которые я использовал в коде с актерами Scala (которые, кстати, все еще работают. Так что, очевидно, ничего не изменилось в настройках брандмауэра, и сервер технически доступен)

Вот важные части кода (которые я в основном копирую, вставленные с домашней страницы akkas):

На сервере актер

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])
}

и на клиенте:

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")
      })
    })

}

Я использую: Scala 2.8.1 (хотя я не уверен, являются ли машины на моем клиенте 2.8 или 2.8.1, я использую scala-library.jar из дистрибутива akka) Акка 1,0

Я знаю, что вы не можете отлаживать ее код, но я был бы очень благодарен за любой намек или идею, что здесь может пойти не так.

P.S .: Исключение выдается в течение доли секунды после попытки отправить Ping. Поэтому я не стал увеличивать время ожидания.

1 Ответ

4 голосов
/ 16 марта 2011

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я ПО Akka

Попробуйте использовать необработанный IP-адрес вместо имени хоста в remote.start (), если это не решает, у вас есть 2 варианта:

  1. Убедитесь, что обе стороны могут разрешать DNS друг за друга
  2. Обновление до текущего мастера (1.1-SNAPSHOT), так как я сделал довольно много изменений, чтобы избежать разрешения имен.

Это помогает?

...