是否可以将 Apache Tomcat 配置为模拟客户端在通过 localhost 从服务器请求数据时通常具有的网络延迟?我正在尝试测试 Java Servlet 应用程序的前端如何响应响应时间较慢的请求。
我知道我可以进入并添加Thread.sleep(100)
到我所有的 Servlet Java 源文件中,但我宁愿有一个可以在 Tomcat 中而不是在我的实际应用程序中配置的解决方案。
是否可以将 Apache Tomcat 配置为模拟客户端在通过 localhost 从服务器请求数据时通常具有的网络延迟?我正在尝试测试 Java Servlet 应用程序的前端如何响应响应时间较慢的请求。
我知道我可以进入并添加Thread.sleep(100)
到我所有的 Servlet Java 源文件中,但我宁愿有一个可以在 Tomcat 中而不是在我的实际应用程序中配置的解决方案。
您可以通过在 localhost 上使用代理来模拟网络延迟,该代理会引入延迟、带宽限制甚至丢弃数据包。
DonsProxy 将完成这项工作。 这是一篇很好的文章,描述了如何配置它以模拟网络不佳的用户。
您可以实现一个servlet 过滤器并让它拦截所有请求。在每个请求中,您都将执行此 Thread.sleep 或其他操作。对您的 servlet 的所有请求都将被延迟。
通过创建阀门,这在 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