以编程方式获得Akka的短暂端口

时间:2013-02-21 06:22:03

标签: scala akka

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

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

1 个答案:

答案 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