关于HttpClient的配置
1、超时
超时的配置很容易忘记。而一旦忘记了,后果可能是一个请求无休止的链接而不释放。占用资源,并且会阻塞后续逻辑。
Httpclient的超时有两种:ConnectionTimeout,和SoTimeout。前者是一个请求在建立连接过程中等待的最长时延;后者是请求建立后等待数据往返的最长时延。
二者的超时时间配置方法是:
HttpConnectionManagerParams managerParams = client
.getHttpConnectionManager().getParams();
// 设置连接超时时间(单位毫秒)
managerParams.setConnectionTimeout(10000);
// 设置设置socket超时时间(单位毫秒)
managerParams.setSoTimeout(10000);
当发生超时的时候,二者分别会抛出org.apache.commons.httpclient.ConnectTimeoutException和java.net.SocketTimeoutException。
2.释放连接
这个不太容易忘记,只是释放连接的语句位置会被忽略。
配置语句是:
PostMethod method = new PostMethod(url);
method.releaseConnection();
要注意的是,method.releaseConnection();一定要放在finnaly语句块中,以保证即使发生异常,也会正常释放链接。
3、编码格式
这个就简单啦,就这一句:
method.getParams().setParameter(
HttpMethodParams.HTTP_CONTENT_CHARSET, "GBK");
当然,GBK可以换成其它合法的编码格式代码。
4、java.net.SocketException: Too many open files的问题
据说(未验证),HttpClient本身存在远程请求不释放socket的问题。在大量并发的情况下,可能导致linux文件句柄用完, 从而系统报错:java.net.SocketException: Too many open files.
解决这个问题的方法,是对HttpClient增加两个配置:
HttpClient client = new HttpClient();
// 配置1:
client.getParams().setBooleanParameter("http.protocol.expect-continue", false);
// 配置2:
method.addRequestHeader("Connection", "close");