Scala 设置DNS查找';这是斯卡拉戏剧的时代

Scala 设置DNS查找';这是斯卡拉戏剧的时代,scala,playframework,dns,ttl,Scala,Playframework,Dns,Ttl,我正在尝试在Scala Play应用程序中设置DNS查找的TimeToLive设置。我使用Play 2.5.9和Scala 2.11.8并遵循。我尝试了以下方法: 在application.conf中 // Set DNS lookup time-to-live to one minute networkaddress.cache.ttl=1 networkaddress.cache.negative.ttl=1 在AppModule或Singleton中(代码类似) 作为环境变量传递:

我正在尝试在Scala Play应用程序中设置DNS查找的TimeToLive设置。我使用Play 2.5.9和Scala 2.11.8并遵循。我尝试了以下方法:

  • 在application.conf中

    // Set DNS lookup time-to-live to one minute
    networkaddress.cache.ttl=1
    networkaddress.cache.negative.ttl=1
    
  • 在AppModule或Singleton中(代码类似)

  • 作为环境变量传递:

    sbt -Dsun.net.inetaddr.ttl=1 clean run
    
我在应用程序中有以下测试代码:

for (i <- 1 to 25) {
  System.out.println(java.net.InetAddress.getByName("google.com").getHostAddress())
  Thread.sleep(1000)
}

for(i要通过
java.security.security
更改DNS缓存的设置,必须提供自定义应用程序加载程序

package modules
class ApplicationLoader extends GuiceApplicationLoader {
  override protected def builder(context: Context): GuiceApplicationBuilder = {
    java.security.Security.setProperty("networkaddress.cache.ttl", "1")
    super.builder(context)
  }
}
构建此应用程序加载器时,可以在
application.conf

play.application.loader = "modules.ApplicationLoader"
之后,您可以使用上面的代码,检查DNS缓存的行为是否与您设置的相同。但请记住,您的系统正在访问一个正在缓存自身的DNS服务器,因此您不会看到更改。 如果您想确保获得不同的google.com地址,您应该使用权威名称服务器,如
ns1.google.com

如果你想在上面写一个测试,你可以写一个测试,请求地址,然后等待指定的时间,直到它再次解决。但是如果DNS系统不受你的控制,比如google.com,这可能是一个问题,如果你用缓存访问DNS服务器。 如果你想开这样一张支票,你可以用它

@RunWith(classOf[JUnitRunner])
class DnsTests extends FlatSpec with Matchers {

  "DNS Cache ttl" should "refresh after 1 second" 
    in new WithApplicationLoader(new modules.ApplicationLoader) {

    // put your test code here

  }
}

正如您所见,您可以将自定义应用程序加载器放在测试后启动的应用程序上下文中。

我可以验证这是否有效,但前提是没有活动的
SecurityManager
(自定义加载器也可以工作,具体取决于配置,但我尚未测试此加载器)。如果启用了默认的
SecurityManager
,那么,根据我在这方面公认的有限经验,您唯一的选择就是在相关的
java.security
文件中定义
networkaddress.cache.ttl=
,或者通过JVM选项进行安全文件覆盖。
@RunWith(classOf[JUnitRunner])
class DnsTests extends FlatSpec with Matchers {

  "DNS Cache ttl" should "refresh after 1 second" 
    in new WithApplicationLoader(new modules.ApplicationLoader) {

    // put your test code here

  }
}