以前写百度贴吧抢二楼程序遇到的问题,此处做一个记录。
httpclient多次进行post请求的时候,会阻塞,无法循环执行(不知道现在的版本还会不会)。网上查过解决方法,在循环体内每次new一个httpclient可以解决,但是感觉不是常规解决方案,最终通过以下方式解决。
问题伪代码如下:
public static void main(String[] args) {
HttpClient httpClient = new HttpClient();
while (true){
HttpGet get = new HttpGet("http://test.com");
HttpResponse responseGet = httpClient.execute(get);
String[] responseStr = EntityUtils.toString(response.getEntity());
for(i=0;i<responseStr.size();i++){
String tempStr = responseStr[i];
HttpPost post = new HttpPost("http://test.com");
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("id","123");
paramMap.put("name", postName);
post.setParam(paramMap);
HttpResponse responsePost = httpClient.execute(post);//第一次循环可以执行到这一句,下一次就一直卡死在此处.
//do something
}
}
}
//只能循环post提交一次,第二次就卡在注释处不动,也不报错
解决方式很简单,其实是因为response结果集未关闭,在做完数据结果处理后关闭结果集即可。修正后代码如下:
public static void main(String[] args) {
HttpClient httpClient = new HttpClient();
while (true){
HttpGet get = new HttpGet("http://test.com");
HttpResponse responseGet = httpClient.execute(get);
String[] responseStr = EntityUtils.toString(response.getEntity());
for(i=0;i<responseStr.size();i++){
String tempStr = responseStr[i];
HttpPost post = new HttpPost("http://test.com");
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("id","123");
paramMap.put("name", postName);
post.setParam(paramMap);
HttpResponse responsePost = httpClient.execute(post);//第一次循环可以执行到这一句,下一次就一直卡死在此处.
//do something
responsePost.getEntity().getContent().close();//关闭结果集
}
}
}