搜索系统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表示连接时间为无穷大。
- 搜索系统14:HttpClient怎么有两个超时参数,都该怎么配?
- setTimeout中调用函数有参数该怎么传递
- 我的电脑系统有问题中毒了,或者有需要还原系统该怎么操作?
- HttpClient在使用中有两个超时时间
- HttpClient在使用中有两个超时时间_hanCSDN_20130506
- HttpClient在使用中有两个超时时间 区别(转)
- HttpClient在使用中有两个超时时间 区别
- 五脏有问题,该怎么调理?
- 使用httpclient 两个超时参数--与下载有关
- asp有数据库按URL参数查询时分页导航该怎么做
- .NET中的SESSION该怎么设置超时时间
- 页面有两个gridView,怎么做全选
- 开放api接口平台都会有appid、appkey、appsecret,这几个参数都有什么用,是怎么生成的?
- 怎么折腾怎么有。。。。。
- Session超时怎么判断
- 怎么判断数据库连接超时
- 使用两个摄像机共用深度,该怎么做?
- DAO和Factory模式有什么区别?该怎么处理
- 2016-11-3 IDEA调试hadoop的错误
- GridView控件实现分页
- centos6部署sock5代理软件dante
- Android Studio保存版本在svn
- 用户名灰色提示
- 搜索系统14:HttpClient怎么有两个超时参数,都该怎么配?
- 富文本编辑器——百度UEditor插件安装教程
- 自己无意中测试出的一段很有意思的代码!
- java基础------------------继承
- Git 分支管理
- 2017-5-12 Kettle对接Hadoop
- Linux 命令(收集)
- 大数据时代的新BI系统架构发展趋势
- 链表基本操作