2013-03-28 41 views
4

我正在編寫一個Akka微內核應用程序,並希望使用java.net.InetAddress.getLocalHost.getHostAddress來確定它是自己的主機IP。如果此通話成功,我會使用地址akka.remote.netty.hostname,但如果沒有,我會回落到application.config中的值。將Akka配置與我的配置結合起來

這與System.setProperty("akka.remote.netty.hostname", addr)一起工作正常,的Akka docs中顯示。

問題出現在我想首先檢查是否在application.config中設置了其他某個鍵時。例如,以下內容將無法覆蓋主機地址,因爲(我認爲)初始調用ConfigFactory.load()意味着後面的System.setProperty不起作用。

if(ConfigFactory.load().getBoolean("my-app.do-something")){ 
    //Do some stuff, then change the host address 
    Try{ 
     java.net.InetAddress.getLocalHost.getHostAddress 
    } match { 
     case Success(addr) => 
      System.setProperty("akka.remote.netty.hostname", addr) 
     case Failure(_) => 
    } 
} 

我必須使用配置我自己的應用程序單獨的配置文件,或者是有另一種方式來解決上述問題?

回答

2

呼叫

ConfigFactory.invalidateCaches() 

後您設置的屬性。這是記住單元測試的好技術。

可替代地,使用像解析的配置片段和fallbackTo

def remoteConfig(hostname: String, port: Int, commonConfig: Config): Config = { 
    val configStr = s""" 
    akka.remote.netty.hostname = $hostname 
    akka.remote.netty.port = $port 
    """ 
    ConfigFactory.parseString(configStr).withFallback(commonConfig) 
} 

val baseConfig = ConfigFactory.load() 
val akkaConfig = if (!baseConfig.getBoolean("my-app.do-something")) baseConfig 
else 
    Try(java.net.InetAddress.getLocalHost.getHostAddress). 
    map(remoteConfig(_, 0, baseConfig)). 
    getOrElse(baseConfig) 

val system = ActorSystem("foo", akkaConfig)