httpclinet在多线程中使用的注意事项

在mapreduce中的reduce阶段使用httpclient发送http请求,之前使用的方式是在执行execute的时候绑定ResponseHandler,在handle里面只返回http status code,程序能够正常运行。

由于提供接口的服务商的性能问题导致请求频繁的时候,系统会返回500错误,但是只返回http status code的话,对方说不能定位错误,必须把返回的错误信息记录下来,所以就修改了http的execute的调用方式,没有绑定responsehandler,在mapreduce运行中,出现了如下的错误:

Error: java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
	at org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:162)
	at org.apache.http.impl.conn.BasicClientConnectionManager$1.getConnection(BasicClientConnectionManager.java:139)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:456)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)

经过查询得知错误的原因是因为http的entity里面的信息没有读取完,没有关闭承载entity中content的inputstream。需要调用Entity.consume(response.getEntity())关闭本次请求的inputstream。