我想构建一个在静态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地址。
答案 0 :(得分:1)
Actor
有一个名为sender
的方法,可以在actor的receive
方法中调用,以获取对发送当前消息的actor(ActorRef
)的引用。 ActorRef
有ActorPath
,RootActorPath
的{{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))