如果我在Akka中配置一个ActorSystem来使用一个emphemeral tcp端口(更具体地说,我将http端口配置为0),有没有办法在ActorSystem启动后以编程方式获取此端口?
使用actorOf创建actor的任何尝试,然后打印出actor路径都会显示本地引用的actor。另外,我尝试在事件流上注册RemoteLifeCycleEvent侦听器,但这只能在服务器启动后完成,因此错过了RemoteServerStarted事件。
答案 0 :(得分:3)
你走了:
class MyExtensionImpl(system: ExtendedActorSystem) extends Extension {
def address = system.provider match {
case rarp: RemoteActorRefProvider => rarp.transport.address
case _ => system.provider.rootPath.address
}
}
object MyExtension extends ExtensionKey[MyExtensionImpl]
val address = MyExtension(system).address
val port = address.port.getOrElse(sys.error("not a remote actor system"))
(请注意,此代码适用于Akka 2.0.x.在2.1.x中,您可以使用RemoteActorRefProvider
避免浏览system.provider.getDefaultAddress