解决httpclient出现too many open file

来源:互联网 发布:宋灭亡王安石 知乎 编辑:程序博客网 时间:2024/06/05 09:32

在httpclient请求是 如果在某段时间内频繁使用httpclient请求会会出现

java.net.SocketException: Too many open filesat java.net.Socket.createImpl(Socket.java:397)at java.net.Socket.<init>(Socket.java:371)at java.net.Socket.<init>(Socket.java:249)at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:79)at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:121)at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706)at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:386)at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)at common.BaseAction.reqGet(BaseAction.java:111)at android_interface.classification.ClassificationInterface.getAllFenlei(ClassificationInterface.java:95)


这是因为:

HttpClient建立Socket时 ,method.releaseConnection()并没有真正关闭连接,而是将该连接提交给 MultiThreadedHttpConnectionManager,等待复用。
而http的连接是等待timeout才会自动断开的,所以,当用完系统的句柄后,自然会报Too many open files。

解决方法

method.addRequestHeader( "Connection", "close");
client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );


HttpClient client = new HttpClient();// 设置关闭client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );client.getParams().setContentCharset("utf-8");HttpMethod method = new GetMethod(url);// 设置关闭method.addRequestHeader( "Connection", "close");try {client.executeMethod(method);result = method.getResponseBodyAsString();} catch (Exception e) {log.error(" httpclient 请求 " + url +"异常 " , e);}finally{method.releaseConnection();}  


0 0
原创粉丝点击