搜索系统14:HttpClient怎么有两个超时参数,都该怎么配?

来源:互联网 发布:淘宝债券公司诈骗 编辑:程序博客网 时间:2024/04/29 07:13

在Java的网络应用中,apache的HttpClient用的很多,比如Solrj中就用的是这个来给服务器发请求。其中有两个超时参数可配置,一个是HttpClientUtil.setConnectionTimeout,另一个是HttpClientUtil.setSoTimeout。通过debug代码发现在类org.apache.http.conn.scheme.PlainSocketFactory的connectSocket方法中,这两个参数是要Socket用,HttpClient基本就是转一下。如下图:


进入java.net.Socket类的setSoTimeout方法,可以看到注释:


好了,我们了解到了soTimeout是读取数据的超时时间。那connectionTimeout呢?通过debug我们能看到最终使用的地方:本地的waitForConnect方法。


还是看一下堆栈信息,这个代码位置是java.net.DualStackPlainSocketImpl的85行。直接进不去,可import,然后eclipse下Ctrl+左键进入。



这时有个疑问,既然soTimeout是InputStream.read方法用的,那connectionTimeout是在这个之前还是之后呢?一般来讲,网络程序的执行过程都是先建立连接再读取数据。我还是通过代码来证明下,
在org.apache.http.impl.client.DefaultRequestDirector的execute方法实现里可以查到。先调用了tryConnect方法再调用tryExecute方法,正好对应了connectionTimeout与soTimeout的执行时机,这个代码跨度太大就不贴图了。


这两种超时抛出的异常也不一样,soTimeout会明确的抛一个SocketTimeoutException并且加一个read time out。如下图:


而onnectionTimeout在HttpClient会被包装为一个ConnectionTimeoutException的对象,如本文第一张图所示。



这两个超时参数是给Socket用的,而几乎所有的Java Tcp连接都基于这个Socket,所以这两个的参数的应用适用于很多其它地方。比如,数据库连接、基于HttpClient的爬虫、本文的solrj等。在HttpClient中如果不设置这两个参数,那么就都给默认0。soTimeout的0表示读取时间不限,而connectionTimeout表示连接时间为无穷大。

阅读全文
0 0
原创粉丝点击