2013-02-21 50 views
3

如果我配置Akka的ActorSystem使用emphemeral tcp端口(更具體地說,我將http端口配置爲0),是否有一種方法可以在ActorSystem啓動後以編程方式獲取此端口?以編程方式獲取Akka的臨時端口

任何嘗試使用actorOf創建actor並打印出actor路徑都會顯示一個本地引用的actor。另外,我嘗試在事件流上註冊RemoteLifeCycleEvent偵聽器,但這隻能在服務器啓動後完成,因此會錯過RemoteServerStarted事件。

回答

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")) 

(注意,此代碼與阿卡2.0.x的在2.1.x的,你可以通過避免去RemoteActorRefProvider使用system.provider.getDefaultAddress