4

私は Akka マイクロカーネル アプリケーションを作成していますjava.net.InetAddress.getLocalHost.getHostAddress。この呼び出しが成功した場合は、プロパティのアドレスを使用しますが、成功しakka.remote.netty.hostnameなかった場合は の値にフォールバックしますapplication.config

Akka docsSystem.setProperty("akka.remote.netty.hostname", addr)で示されているように、これは で正常に機能していSimpleClusterAppました。

問題が発生したのは、application.config に他のキーが設定されているかどうかを最初に確認したかったときです。たとえば、以下はホストアドレスのオーバーライドに失敗します。これは、(私が思うに) への最初の呼び出しは、後に続く which が効果がないことを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(_) => 
    }
}

独自のアプリケーションを構成するために別の構成ファイルを使用する必要がありますか、または上記の問題を解決する別の方法はありますか?

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 に答える