栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Apache HttpClient如何在请求和响应上设置超时

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Apache HttpClient如何在请求和响应上设置超时

您将看到的例外是

ConnectTimeoutException
SocketTimeoutException
。您使用的实际超时值应该是应用程序愿意等待的最长时间。关于读取超时的一个重要说明是,它对应于套接字读取的超时。因此,这不是完全响应到达所允许的时间,而是单个套接字读取所给的时间。因此,如果有4个套接字读取,每个读取耗时9秒,那么您的总读取时间为9* 4 = 36秒。

如果要指定响应到达的总时间(包括连接和总读取时间),则可以将调用包装在线程中,并为此使用线程超时。例如,我通常这样做:

Future<T> future = null;future = pool.submit(new Callable<T>() {    public T call() {        return executeImpl(url);    }   });try {    return future.get(10, TimeUnit.SECONDS);}   catch (InterruptedException e) {    log.warn("task interrupted", name);}   catch (ExecutionException e) {    log.error(name + " execution exception", e); }   catch (TimeoutException e) {    log.debug("future timed out", name);}

上面代码中的一些假设是:1)这是在带有url参数的函数中,2)它在具有名称变量的类中,3)log是log4j实例,4)pool是某个线程池执行程序。请注意,即使您使用了线程超时,也应该在HttpClient上指定连接和套接字超时,以免慢速请求不会占用线程池中的资源。还要注意,我使用线程池,因为通常我在Web服务中使用线程池,因此线程池在许多tomcat线程之间共享。您的环境可能有所不同,您可能希望为每个调用简单地产生一个新线程。

另外,我通常会看到通过参数的成员函数设置的超时,如下所示:

params.setConnectionTimeout(10000);params.setSoTimeout(10000);

但是也许您的语法也能正常工作(不确定)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453560.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号