2016-11-29 17 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 

    } 
} 

做到這一點正如你可以看到你可以把自定義的應用程序加載器應用程序的情況下開始測試之後。