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) 服务器一样。但是,我不知道,为什么这工作正常!