我正在尝试在Scala-Play应用程序中为DNS查找设置TimeToLive设置。我使用Play 2.5.9和Scala 2.11.8并关注the AWS guide。我尝试了以下方法:
// Set DNS lookup time-to-live to one minute
networkaddress.cache.ttl=1
networkaddress.cache.negative.ttl=1
class AppModule() extends AbstractModule {
Security.setProperty("networkaddress.cache.ttl", "1")
Security.setProperty("networkaddress.cache.negative.ttl", "1")
...
}
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)
}
这始终打印相同的IP地址,例如216.58.212.206。对我来说,看起来上面指定的方法都没有任何效果。但是,也许我正在测试其他东西而不是TTL的价值。因此,我有两个问题:
要通过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
}
}
如您所见,您可以将自定义应用程序加载器放在测试后面的应用程序上下文中。