3

如果我在 Akka 中配置 ActorSystem 以使用临时 tcp 端口(更具体地说,我将 http 端口配置为 0),一旦 ActorSystem 启动,有没有办法以编程方式获取此端口?

任何尝试使用actorOf 创建一个actor,然后打印出actor 路径都会显示一个本地引用的actor。此外,我尝试在事件流上注册 RemoteLifeCycleEvent 侦听器,但这只能在服务器启动后完成,因此会错过 RemoteServerStarted 事件。

4

1 回答 1

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

于 2013-02-21T18:37:16.850 回答