我正在编写一个Akka微内核应用程序,并希望使用java.net.InetAddress.getLocalHost.getHostAddress
确定它自己的主机IP。如果此调用成功,那么我将使用属性akka.remote.netty.hostname
的地址,但如果不是,我将回退到application.config
中的值。
这与System.setProperty("akka.remote.netty.hostname", addr)
的工作正常,如Akka docs中的SimpleClusterApp
所示。
当我想首先检查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(_) =>
}
}
我必须使用单独的配置文件来配置我自己的应用程序,还是有其他方法来解决上述问题?
答案 0 :(得分: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)