关于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");