使用Apache Tomcat模拟网络延迟?

时间:2012-06-14 17:46:04

标签: java tomcat networking servlets

是否可以配置Apache Tomcat来模拟客户端在通过localhost从服务器请求数据时通常会遇到的网络延迟?我正在尝试测试Java Servlet应用程序的前端如何响应响应时间较慢的请求。

我知道我可以进入并将Thread.sleep(100)添加到我的所有Servlet Java源文件中,但我宁愿有一个可以在Tomcat而不是在我的实际应用程序中配置的解决方案。

3 个答案:

答案 0 :(得分:4)

您可以通过在localhost上使用代理来模拟网络延迟,这会导致延迟,带宽限制,甚至丢弃数据包。

DonsProxy将完成这项工作。 Here's一篇很好的文章,介绍如何配置它以模拟网络不良的用户。

答案 1 :(得分:1)

您可以实施servlet filter并拦截所有请求。在每个请求中,您将执行此Thread.sleep或其他内容。对您的servlet的所有请求都将被延迟。

答案 2 :(得分: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目录的jar中编译它(通常是{catalina.home} / lib)。

最后在server.xml中添加阀门声明:

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

HIH