HttpClient 连接超时重试处理

记录一次HttpClient 连接超时重试问题

原代码如下:

public static void main(String[] args) throws UnsupportedEncodingException {HttpClient httpClient = new HttpClient();httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);String url="XXXXXX你的请求接口";GetMethod getMethod = new GetMethod(url);//设置请求超时为5秒getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置请求重试处理,用的是默认的重试处理:请求三次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());String response = "";try {int statusCode = httpClient.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK){System.err.println("请求出错:" + getMethod.getStatusLine());}byte[] responseBody = getMethod.getResponseBody();response = new String(responseBody, "utf-8");System.out.println("-----------response:" + response);} catch (HttpException e) {System.out.println("请检查输入的URL!");e.printStackTrace();} catch (IOException e) {System.out.println("发生网络异常!");} finally {getMethod.releaseConnection();}}

getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());  =====》这里设置了默认的请求重试处理类,默认会重试3次。

实测过程中发现在连接超时后直接报错SocketTimeoutException,并不会重试。

为什么呢?这里我们看下DefaultHttpMethodRetryHandler、SocketTimeoutException这两个类的源码。

1、发现SocketTimeoutException继承InterruptedIOException

 

2、在DefaultHttpMethodRetryHandler请求处理中retryMethod这个方法会判断是否进行重试,第109行发现在判断异常类型为InterruptedIOException时,返回false

 真相大白,在httpclient的默认重试处理类(DefaultHttpMethodRetryHandler)中,连接超时报错会并不会重试。

这里我们可以自定义重试处理类(复制粘贴DefaultHttpMethodRetryHandler的类,将这里return true,或者直接在上面加一个判断SocketTimeoutException

异常的代码)就可以了,然后将这里换成我们自己的处理类。

 

自定义处理类代码如下MyHttpMethodRetryHandler:


import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpMethodRetryHandler;
import org.apache.commons.httpclient.NoHttpResponseException;import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.NoRouteToHostException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;public class MyHttpMethodRetryHandler implements HttpMethodRetryHandler {private static Class SSL_HANDSHAKE_EXCEPTION = null;static {try {SSL_HANDSHAKE_EXCEPTION = Class.forName("javax.net.ssl.SSLHandshakeException");} catch (ClassNotFoundException ignore) {}}/** the number of times a method will be retried */private int retryCount;/** Whether or not methods that have successfully sent their request will be retried */private boolean requestSentRetryEnabled;/*** Creates a new DefaultHttpMethodRetryHandler.* @param retryCount the number of times a method will be retried* @param requestSentRetryEnabled if true, methods that have successfully sent their request will be retried*/public MyHttpMethodRetryHandler(int retryCount, boolean requestSentRetryEnabled) {super();this.retryCount = retryCount;this.requestSentRetryEnabled = requestSentRetryEnabled;}/*** Creates a new DefaultHttpMethodRetryHandler that retries up to 3 times* but does not retry methods that have successfully sent their requests.*/public MyHttpMethodRetryHandler() {this(3, false);}/*** Used <code>retryCount</code> and <code>requestSentRetryEnabled</code> to determine* if the given method should be retried.** @see HttpMethodRetryHandler#retryMethod(HttpMethod, IOException, int)*/@Overridepublic boolean retryMethod(final HttpMethod method,final IOException exception,int executionCount) {if (method == null) {throw new IllegalArgumentException("HTTP method may not be null");}if (exception == null) {throw new IllegalArgumentException("Exception parameter may not be null");}// HttpMethod interface is the WORST thing ever done to HttpClientif (method instanceof HttpMethodBase) {if (((HttpMethodBase)method).isAborted()) {return false;}}if (executionCount > this.retryCount) {// Do not retry if over max retry countreturn false;}if (exception instanceof NoHttpResponseException) {// Retry if the server dropped connection on usreturn true;}if (exception instanceof SocketTimeoutException) {return true;}if (exception instanceof InterruptedIOException) {// Timeoutreturn false;}if (exception instanceof UnknownHostException) {// Unknown hostreturn false;}if (exception instanceof NoRouteToHostException) {// Host unreachablereturn false;}if (SSL_HANDSHAKE_EXCEPTION != null && SSL_HANDSHAKE_EXCEPTION.isInstance(exception)) {// SSL handshake exceptionreturn false;}if (!method.isRequestSent() || this.requestSentRetryEnabled) {// Retry if the request has not been sent fully or// if it's OK to retry methods that have been sentreturn true;}// otherwise do not retryreturn false;}/*** @return <code>true</code> if this handler will retry methods that have* successfully sent their request, <code>false</code> otherwise*/public boolean isRequestSentRetryEnabled() {return requestSentRetryEnabled;}/*** @return the maximum number of times a method will be retried*/public int getRetryCount() {return retryCount;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 ping命令-请求超时 问题

​ ​ ​ 在连接局域网的过程中&#xff0c;我们经常使用 ping ip地址 的命令来测试网络情况&#xff0c;但总是遇到请求超时的情况。 当遇到这种情况时&#xff1a; ​ ​ 第一步&#xff1a;检查设备&#xff0c;所有设备检查无误且两台电脑能正常上网&#xff0c;进…

解决MobaXtermSSH连接超时(Network error:Conection timed out )

报错描述 Network error:Conection timed out 解决MobaXtermSSH连接超时&#xff0c;无法连linux IP地址的问题 使用的是MobaXterm远程连接我使用VMware创建的虚拟机。 ssh测试 1.检测一下linux系统上有没有安装ssh&#xff0c;一般情况是可以自动安装的&#xff0c;但是由于c…

Efficient Teacher

这里是针对YOLOv5的半监督目标检测实现 Efficient Teacher包含一篇论文(https://arxiv.org/pdf/2302.07577.pdf)和一套开源代码库(https://github.com/AlibabaResearch/efficientteacher)。其中&#xff0c;论文讲解了如何针对YOLOv5进行半监督训练&#xff0c;开源代码库可以…

一个巨型的ESP8266模块,围观围观

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇 微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09; 01 巨型ESP8266 ESP8266几乎无人不知&#xff0c;无人不晓了吧&#xff0c;相当一部分朋友接触物联网都是从ESP8266开始的&#xff…

入局AI时代,先从了解AI工具入手(200 个免费的 AI 工具分享)

这些工具是从业人员提升创造力和生产力的新领域&#xff01;从生成独特的图像到将文本转换为语音&#xff0c;这些工具可以快速帮助你实现曾经难以想象的结果。 它们代表了人与机器之间的桥梁&#xff0c;这种合作可以开启新的可能性领域。拥抱 AI工具&#xff0c;可以极大的升…

资源盘点丨9个经典视觉-语言多模态预训练数据集

在 ChatGPT 引爆社会与学术界的热点后&#xff0c;“大模型”与“多模态”也成为了搜索量攀升的热门词汇。这些体现了大众对人工智能的广泛关注。 事实上&#xff0c;人工智能的进步离不开深度学习方法在各个具体任务上的进展。其中&#xff0c;尤其是预训练任务的方法&#x…

SolidEdge C#.NET 二次开发系列教程(一) 安装部署插件

SE二次开发国内的教程简直太少了&#xff0c;为了学习这块&#xff0c;废了不少功夫&#xff0c;走了不少弯路。 特此开贴写教程以示后人。 se插件开发完成后就是如何部署&#xff0c;安装和部署和其他的.net插件类似。 1.走到这步你基本离成功很近了。 准备好你的dll插件的 Gu…

纵使AI再强悍,低代码风韵犹存

互联网沉默已久&#xff0c;ChatGPT的出现激起千层浪&#xff0c;沉寂已久的互联网迎来新一轮的机遇。毫不夸张地说&#xff0c;任何一家以技术见长的企业&#xff0c;人工智能绝对占有一席之地。 目录 人工智能很强悍 低代码风韵犹存 快速开发平台&#xff0c;大有看头 AI…

Chatgpt商业版开源部署教程

基于 ChatGpt-Web 项目二开的可商业化的 ChatGpt Web 应用&#xff08;含后端&#xff09; github上的大佬基于 ChatGpt-Web 项目二开的可商业化的 ChatGpt Web 应用&#xff08;含后端&#xff09; 修复部分了bug 卡密、支付、对话、模型等 历史对话同步功能 演示图片 主要…

ChatGPT基础知识系列之Transformer模型详解

ChatGPT之Transformer模型详解 Transformer由论文《Attention is All You Need》提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。 1.Transformer 整体结构 首先介绍 Transformer 的整体结构,下图是 Tr…

聚观早报|王慧文要做「中国版 OpenAI」;Temu斥资近亿元赞助超级碗

点击蓝字 / 关注我们今日要闻&#xff1a;王慧文要做「中国版 OpenAI」&#xff1b;Temu斥资近亿元赞助超级碗&#xff1b;新东方在线股价收跌2.8%&#xff1b;ChatGPT带动的AIGC创业热潮要来了&#xff1b;传谷歌拆分其AR部门 王慧文要做「中国版 OpenAI」 2 月 13 日&#x…

上帝掷骰子吗?

“上帝掷骰子吗&#xff1f;” 这句名言出自物理学家爱因斯坦之口。都说现代人经常陷于迷茫&#xff0c;其实我们并不孤单&#xff0c;因为作为史上最伟大的物理学家之一、相对论的创始人&#xff0c;爱因斯坦在面对量子力学的随机性和不确定性&#xff0c;同样感到迷茫。 一本…

2023年十大流媒体发展趋势展望

点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 编者按&#xff1a;经历了三年疫情&#xff0c;2023年流媒体将如何发展&#xff1f;虽然本文主要针对海外市场&#xff0c;但依然值得国内借鉴&#xff0c;比如AIGC、远程制播…

3名离职员工窃取公司游戏源码,半年狂赚 1.5 亿,网友:“自立门户也不带这样玩的!”...

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 对于游戏公司而言&#xff0c;安全、抄袭问题总是「防不胜防」。 不仅要抵御黑客攻击、排查自身的安全漏洞&#xff0c;还要警惕员工拿着代码跑了&#xff01; 近日&#xff0c;据上海市…

百度将?百度已!

仿佛一夜之间&#xff0c;创业公司OpenAI旗下的ChatGPT就火遍全球。 这是一场十分罕见的科技盛宴。下到普通用户&#xff0c;上到各科技大厂都在讨论ChatGPT的前景&#xff0c;国外的微软、谷歌&#xff0c;国内的百度、腾讯、阿里等等都在布局相关业务。比尔盖茨更是称ChatGPT…

Stable Diffusion动画版上线!十五种风格预设,支持文本图像视频多种输入方式

西风 发自 凹非寺量子位 | 公众号 QbitAI Stable Diffusion也能生成视频了&#xff01; 你没听错&#xff0c;Stability AI推出了一款新的文本生成动画工具包Stable Animation SDK&#xff0c;可支持文本、文本初始图像、文本视频多种输入方式。 使用者可以调用包括Stable Diff…

Stable Diffusion能生成视频了!动画版上线!支持文本图像视频多种输入方式

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【GAN和扩散模型】微信技术交流群 西风 发自 凹非寺转载自&#xff1a;量子位&#xff08;QbitAI&#xff09; Stable Diffusion也能生成视频了&#xff01; 你没听错&#x…

关于stable diffusion的embedding训练的一篇随笔

前言 嗯&#xff0c;因为最近ai绘画很火啊&#xff0c;而且可以本地部署&#xff0c;很多人开始投喂ai然后画一些喜欢的东西&#xff0c;这是刚接触4天的笔记&#xff0c;那么我整理下目录&#xff0c;来展示一下这篇笔记都有什么吧。 1,绘画的关键词和反向关键词 2&#xf…

图像处理:Tiler制作你的专属卡通头像和LOGO(圣诞特别篇)

目录 0 前言1 安装与贴图2 算法原理2.1 计算像素频率2.2 计算像素相对距离2.3 计算合适贴图 3 配置功能4 使用&#xff1a;以圣诞老人为例推荐内容 0 前言 Tiler是一种使用各种其他较小图像平铺创建新图像的工具&#xff0c;它与其他马赛克工具不同&#xff0c;因为它可以适应多…

ChatGPT 3.5 的回答只能基于 2021年中期

ChatGPT 无法通过 internet 来访问 2021 年中期之后的数据。 比如无法列举 2021年 IT 界发生的新闻。 2021年的新闻则可以列举出来 以下是2021年IT界十大轰动性的新闻&#xff1a; 苹果公司推出 M1 芯片&#xff1a;苹果公司在2020年底发布了第一批基于自研M1芯片的Mac电脑&…