在Scala Play中设置DNS查找的TimeToLive

Ole*_*ets 10 dns scala ttl playframework

我正在尝试在Scala-Play应用程序中为DNS查找设置TimeToLive设置.我使用Play 2.5.9和Scala 2.11.8并遵循AWS指南.我尝试了以下方法:

我在应用程序中有以下测试代码:

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

这始终打印相同的IP地址,例如216.58.212.206.对我来说,看起来上面指定的方法都没有任何效果.但是,也许我正在测试其他东西而不是TTL的价值.因此,我有两个问题:

  • 将安全变量传递给Play应用程序的正确方法是什么?
  • 怎么测试呢?

Bjö*_*ter 7

要更改DNS缓存的设置,java.security.Security您必须提供自定义应用程序加载器.

package modules
class ApplicationLoader extends GuiceApplicationLoader {
  override protected def builder(context: Context): GuiceApplicationBuilder = {
    java.security.Security.setProperty("networkaddress.cache.ttl", "1")
    super.builder(context)
  }
}
Run Code Online (Sandbox Code Playgroud)

构建此应用程序加载器时,您可以在其中启用它 application.conf

play.application.loader = "modules.ApplicationLoader"
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用上面的代码并检查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

  }
}
Run Code Online (Sandbox Code Playgroud)

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