3

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

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

4

3 回答 3

4

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

DonsProxy 将完成这项工作。 这是一篇很好的文章,描述了如何配置它以模拟网络不佳的用户。

于 2012-06-14T18:13:46.573 回答
1

您可以实现一个servlet 过滤器并让它拦截所有请求。在每个请求中,您都将执行此 Thread.sleep 或其他操作。对您的 servlet 的所有请求都将被延迟。

于 2012-06-14T17:54:48.687 回答
1

通过创建阀门,这在 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);
}

将它编译到一个 jar 中,然后放入 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

于 2012-10-22T17:50:32.733 回答