4

我正在编写一个 Akka 微内核应用程序,并希望它使用java.net.InetAddress.getLocalHost.getHostAddress. 如果此调用成功,那么我将使用属性的地址akka.remote.netty.hostname,但如果不是,我将回退到application.config.

System.setProperty("akka.remote.netty.hostname", addr)Akka docsSimpleClusterApp中所示,这可以正常工作。

当我想首先检查是否在 application.config 中设置了其他键时,问题就来了。例如,以下将无法覆盖主机地址,因为(我认为)初始调用ConfigFactory.load()意味着后面的System.setPropertywhich 无效。

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(_) => 
    }
}

我必须使用单独的配置文件来配置我自己的应用程序,还是有其他方法可以解决上述问题?

4

1 回答 1

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)
于 2013-03-28T21:05:28.180 回答