前两天做项目时,用了httpclient MultiThreadedHttpConnectionManager,其中有两个参数 setDefaultMaxConnectionsPerHost,setMaxTotalConnections,刚开始对着两个参数的理解模模糊糊,后来经过代码测试,才终于彻底明白了,接下来我就贴上一些代码来加以说明
public class HttpClient {
MultiThreadedHttpConnectionManager manager=null;
public HttpClient(){
manager=new MultiThreadedHttpConnectionManager();//构建全局唯一的线程池
}
public String getPostResponse(String url,String encode,String requestBody){
org.apache.commons.httpclient.HttpClient client=new org.apache.commons.httpclient.HttpClient(manager);
setParam(manager);
PostMethod post=new PostMethod(url);
setPostParam(post,requestBody);
String result=null;
StringBuffer sb=new StringBuffer();
BufferedReader in=null;
try {
client.executeMethod(post);
in=new BufferedReader(new InputStreamReader(post.getResponseBodyAsStream(), post.getRequestCharSet()));
String inputLine = null;
while ((inputLine = in.readLine()) != null)
{
sb.append(inputLine);
sb.append("\n");
}
result = ConverterStringCode(sb.toString() , post.getResponseCharSet(), encode);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
post.releaseConnection();
if(in !=null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
in=null;
}
}
}
return result;
}
private static void setParam(MultiThreadedHttpConnectionManager manager){
manager.getParams().setConnectionTimeout(5000);
manager.getParams().setSoTimeout(20000);//read time out
manager.getParams().setDefaultMaxConnectionsPerHost(32);
manager.getParams().setMaxTotalConnections(128);
}
private static String ConverterStringCode(String source, String srcEncode,String destEncode)
{
if (source != null)
{
try
{
return new String(source.getBytes(srcEncode), destEncode);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
return "";
}
} else {return "";}
}
private static void setPostParam(PostMethod post,String requestBody){
post.getParams().setParameter(HttpMethodParams.HTTP_ELEMENT_CHARSET, "utf-8");
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8");
try {
ByteArrayRequestEntity entity=new ByteArrayRequestEntity(requestBody.getBytes("utf-8"));
post.setRequestEntity(entity);
post.setFollowRedirects(false);
post.setRequestHeader("Content-Length", String.valueOf(entity.getContentLength()));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其中getPostResponse方法是本次测试的重点.
如果setDefaultMaxConnectionsPerHost设置为默认值(2),代表着每台主机最多可以有两个httpconnection,但是如果实际项目中需要并发的同时访问某一服务器a,例如有5个线程同时在不断的给服务器a发送请求,但是由于setDefaultMaxConnectionsPerHost设置的最大数为2,所以实际只有两个线程可以访问,另外三个线程必须等待着两个线程处理完毕后才会发送请求.