2012-06-14 59 views
3

是否可以配置Apache Tomcat來模擬客戶端通過本地主機向服務器請求數據請求數據時的網絡延遲?我試圖測試Java Servlet應用程序的前端如何響應響應時間較慢的請求。使用Apache Tomcat模擬網絡延遲?

我知道我可以進去並將Thread.sleep(100)添加到我的所有Servlet Java源文件中,但是我寧願有一個可以在Tomcat中配置的解決方案,而不是在我的實際應用程序中。

回答

4

您可以通過在本地主機上使用代理來模擬網絡延遲,從而引入延遲,帶寬限制甚至丟棄數據包。

DonsProxy將完成這項工作。 Here's一篇很好的文章,描述如何配置它以模擬貧窮網絡上的用戶。

1

您可以實施servlet filter並讓它攔截所有請求。在每一個請求中,你都會做這個Thread.sleep或其他的東西。所有對您的servlet的請求將被延遲。

+0

這不是真正的Tomcat配置雖然。或者我錯過了什麼?測試應用程序和已部署的應用程序將具有不同的web.xml文件,對嗎? – Ivan

0

這在Tomcat中通過創建閥門很容易實現。

創建一個從tomcat擴展ValveBase類的類。

內部代碼應該是類似的東西:

/** 
* {@inheritDoc} 
*/ 
@Override 
public void invoke(final Request request, final Response response) 
        throws IOException, ServletException { 

    if (randomDelay != 0) { 
     long delay = minDelay + randomizer.nextInt(randomDelay); 
     try { 
      if (LOGGER.isDebugEnabled()) { 
       LOGGER.debug("sleeping for " + delay + " ms"); 
      } 
      Thread.sleep(delay); 
     } catch (InterruptedException e) { 
      if (LOGGER.isDebugEnabled()) { 
       LOGGER.debug("someone wake me up : " + e.getMessage()); 
      } 
     } 
    } 

    // let's continue ! 
    getNext().invoke(request, response); 
} 

編譯它在一個罐子裏,你會在Tomcat的lib目錄下(通常{}的catalina.home/lib目錄)下降。

最後添加閥聲明中你將server.xml:

<Server ...> 
    <Service name="Catalina"> 
    <Engine name="Catalina" defaultHost="localhost"> 
    (...) 
    <Host name="localhost" ...> 
     <Valve className="tools.tomcat.RandomDelayValve" /> 

HIH

+0

我的錯誤,我已經更新了答案 – poussma