发送请求到127.0.0.1:8084/(Tomcat)需要~1000ms而127.0.0.1/(Wamp)需要~20ms

时间:2013-01-04 10:29:58

标签: java http tomcat servlets post

    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpClient httpclient = new DefaultHttpClient(params);
    HttpPost httppost = new HttpPost(address);

    try {
        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
    } catch (IOException ex) {
        logger.log(Level.SEVERE, null, ex);
    }

我正在使用此代码段将HTTP POST请求发送到驻留在localhost上的Apache Tomcat上的servlet。对Tomcat地址的post请求(没有任何参数),即http://127.0.0.1:8084需要大约1000 ms。虽然发送到地址http://127.0.0.1的Apache(wamp服务器)时的相同请求只需要20ms。

我已经尝试过两种Http版本(1.0 / 1.1),但响应时间没有效果。

任何可能出错的线索?或者如何改善这种表现?或者是Tomcat本身是如此之慢,我对此问题无能为力? (但是浏览器能够在没有任何重大网络延迟的情况下加载servlet!)

其他信息:

这段代码本身就是一个Servlet,除了发出这个请求之外什么都没做。应该处理请求的servlet也是“空白”。此外,整个场景中没有涉及JSP。并且时间记录不适用于冷tomcat。第一次和(有时)第二次调用需要2000ms。但是连续请求被标准化为超过1000毫秒。所以,这肯定不是一个冷酷的tomcat问题。

现在,这里的人们也向我询问了servlet代码。这是我正在研究的基本设计:

Servlet A应该做一些工作并使用我编写的AgniLogger类来记录它。 该类位于库中,计划从几个组件中使用。它反过来使用上面编写的代码将POST请求发送到servlet B. Servlet B将执行实际的日志记录。现在,这个servlet B还没有实现。 Servlet A和B是不同Web应用程序的一部分。

Servlet A:http://pastebin.com/tQjtvG3g

AgniLogger:http://pastebin.com/nGJypmCN

Servlet B:http://pastebin.com/psCxLCYY

P.S。:我正在使用Netbeans进行开发,到目前为止项目中没有web.xml。

解决方法(虽然非常奇怪!)

如果我将Servlet B中的processRequest()函数的定义从{blank}更改为:

    PrintWriter out = response.getWriter();
    try {
        //do nothing
    } finally { 
        out.close();
    }

问题得到解决。就像端口80上的Apache(WAMP)服务器一样,响应时间减少到大约20ms。但是,我不知道,为什么这个工作正常呢!

1 个答案:

答案 0 :(得分:2)

你不知道你的servlet是做什么的。例如,如果它在其响应中嵌入了一个jsp,则jsp可能需要在首次访问时编译成一个servlet(实现jsps的方式)。在这种情况下尝试第二个请求,这应该比第一个要快很多。

您也可以从“冷”tomcat请求页面,例如并非所有内容都已初始化 - 与第一个选项类似,这将执行一些不会在以后的请求中出现的一次性操作。

过去,当Web服务器或应用程序服务器配置为解析客户端的IP地址(进入反向查找DNS地址)时,我也看到了这种行为。如果失败,通常需要一段时间 - 此操作过去一直阻止请求。

(对此澄清:我已经看到网络服务器为他们的日志文件反向解析IP地址。这在成功的地方相对较快(但需要付出代价),但是当请求的IP地址无法解析时,它被记录为IP(正如您所期望的那样),但是在请求的应答时间内也出现了严重的延迟。我不希望任何应用服务器配置如此开箱即用,但我'过去已经看过这个问题了。缺点是,如果你只看到日志中的滞后和IP地址,可能很难判断你是否正在遭受这种情况。只有你看到DNS名称与各种请求主机的日志中的IP地址)

另外,您将以“127.0.0.1”为例 - 如果这不是真实地址,请确保两种方式都可以访问同一个端点。例如。现在,“localhost”解析为“:: 1”(本地IPV6地址),而不是“127.0.0.1”(IPV4本地地址)。并不是说我希望两种方式在访问servlet方面存在显着差异,但是如果你能在两种访问选项之间找到不同的路径,你可能会更接近找到潜在的问题。