scala - Akka Actor 无法连接到 Scala Actor 可以连接的远程服务器

标签 scala akka

我遇到了一个小问题。我刚刚将当前项目的客户端-服务器通信从远程 Scala Actors 移至远程 Akka Actors。

在我的本地计算机上测试时一切正常,但是一旦我尝试在不同的计算机上使用客户端和服务器运行代码,客户端就无法再访问服务器(我得到一个 java.nio.channels. NotYetConnectedException)。我仔细检查了所使用的 IP 和端口。它与我在 Scala actor 的代码中使用的主机数据相同(顺便说一句,它仍然有效。所以显然防火墙设置没有任何变化,并且服务器在技术上是可访问的)

以下是代码的重要部分(我主要是从 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,但我使用 akka 发行版中的 scala-library.jar) Akka 1.0

我知道你无法调试我的代码,但我非常感谢任何类型的提示或想法这里可能出了什么问题。

P.S.:尝试发送 Ping 后,异常会在瞬间抛出。所以我没有费心增加超时时间。

最佳答案

免责声明:我是 Akka 的 PO

尝试在remote.start()中使用原始IP地址而不是主机名,如果这不能解决问题,您有2个选择:

  1. 确保双方能够 DNS互相解析
  2. 升级至 当前主控(1.1-SNAPSHOT),因为 我做了很多改变 避免名称解析。

这有帮助吗?

关于scala - Akka Actor 无法连接到 Scala Actor 可以连接的远程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5325983/

相关文章:

multithreading - akka actor 如何在底层线程上实现?

scala - 在Scala中, "view"有什么作用?

scala - SBT 测试任务如何管理类路径以及如何从 SBT 测试正确启动 Java 进程

scala - 组合序列元素的最简洁方式

java - 运行 Lagom hello-world 示例时出错

java - 提交flink作业时如何处理akka AskTimeoutException

scala - Play (Scala)、Reactivemongo 和多个数据库

scala - 使用 Akka 以编程方式获取临时端口

scala - Akka 远程角色,没有默认构造函数的父类(super class)

scala - 我们可以使用 Akka 和 Camel 集成来实现 REST 服务吗?