1
    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);
    }

我正在使用此代码片段向驻留在本地主机上的 Apache Tomcat 上的 servlet 发送 HTTP POST 请求。对 Tomcat 地址的发布请求(不带任何参数),即http://127.0.0.1:8084大约需要1000毫秒。虽然将相同的请求发送到地址的 Apache(wamp 服务器)http://127.0.0.1只需要 20 毫秒。

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

任何可能出错的线索?或者如何提高这个性能?还是Tomcat本身太慢了,我对此问题无能为力?(但是浏览器能够加载 servlet 而没有任何明显的网络延迟!)

附加信息:

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

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

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

小服务程序 A: http: //pastebin.com/tQjtvG3g

AgniLogger:http ://pastebin.com/nGJypmCN

小服务程序 B: http: //pastebin.com/psCxLCYY

PS:我正在使用Netbeans进行开发,目前项目中没有web.xml。

解决方法(虽然很奇怪!)

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

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

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

4

1 回答 1

2

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

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

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

(澄清:我见过网络服务器为他们的日志文件反向解析IP地址。这在成功的地方相对较快(但有代价),但是当请求的IP地址无法解析时,它被记录下来就像IP一样(正如你所期望的那样),但是在请求的响应时间中也可以看到严重的滞后.我不希望任何应用服务器都像这样开箱即用地配置,但我已经看到了过去的问题。缺点是,如果您只在日志中看到滞后和 IP 地址,则可能很难判断您是否正在遭受这种痛苦。只有在您看到 DNS 名称与 IP 地址混合时才清楚各种请求主机的日志)

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

于 2013-01-04T11:32:16.507 回答