2016-11-29 53 views
10

我想在我的Scala-Play应用程序中为DNS查找设置TimeToLive设置。我使用Play 2.5.9和Scala 2.11.8并按照the AWS guide。我尝试以下方法:在Scala Play中设置DNS查找的TimeToLive

  • 在application.conf

    // Set DNS lookup time-to-live to one minute 
    networkaddress.cache.ttl=1 
    networkaddress.cache.negative.ttl=1 
    
  • 中的AppModule或EagerSingleton

    (该代码将是相似的)

    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的价值。因此,我有两个问题:

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

回答

7

要通过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

等待指定的时间直到它再次解析。但是如果你的控制系统像google.com这样的DNS系统,这可能是一个问题,如果你使用缓存命中DNS服务器。 如果你想写这样的检查,你可以用

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

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

    // put your test code here 

    } 
} 

做到这一点正如你可以看到你可以把自定义的应用程序加载器应用程序的情况下开始测试之后。