如果我在 Akka 中配置 ActorSystem 以使用临时 tcp 端口(更具体地说,我将 http 端口配置为 0),一旦 ActorSystem 启动,有没有办法以编程方式获取此端口?
任何尝试使用actorOf 创建一个actor,然后打印出actor 路径都会显示一个本地引用的actor。此外,我尝试在事件流上注册 RemoteLifeCycleEvent 侦听器,但这只能在服务器启动后完成,因此会错过 RemoteServerStarted 事件。
干得好:
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
)