在不知道远程主机地址的情况下远程处理演员

时间:2012-11-22 09:13:54

标签: java akka

我想构建一个在静态IP地址和端口上具有公共服务器的actor系统。将有许多客户端知道服务器的地址。服务器不知道客户端的IP地址。

服务器配置:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
    netty {
      hostname = "46.38.232.161"
      port = 2552
    }
  }
}

客户端配置:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
    netty {
      port = 2553
    }
  }
}

客户可能来自整个互联网。现在我想将客户端上的actor的消息发送给服务器上的actor。服务器如何知道,在哪里发回他的消息?当我将ActorPath发送到服务器时,他就知道对应的客户端地址,这些地址不包含客户端的IP地址。

2 个答案:

答案 0 :(得分:1)

Actor有一个名为sender的方法,可以在actor的receive方法中调用,以获取对发送当前消息的actor(ActorRef)的引用。 ActorRefActorPathRootActorPath的{​​{1}}有Address,其中包含演员所在的ActorSystem的主机和端口。

答案 1 :(得分:1)

在您希望通过网络进行通信的情况下,

akka.remote.netty.hostname属性可以在application.conf内设置为可访问的IP地址或可解析名称。实际上,当使用Akka时,您的“客户端”节点也将成为服务器。

如果地址在应用开始时未知,请考虑来自Akka文档的此代码片段:

import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory

val customConf = ConfigFactory.parseString("""
  akka.actor.deployment {
    /my-service {
      router = round-robin
      nr-of-instances = 3
    }
  }
""")

// ConfigFactory.load sandwiches customConfig between default reference
// config and default overrides, and then resolves it.
val system = ActorSystem("MySystem", ConfigFactory.load(customConf))