okHttp重试机制
RetryAndFollowUpInterceptor,重试流程比较清晰,简略写了下注释,涉及到的类主要就是StreamAllocation,这个类用来管理链接connection、请求及编解码类HttpCodec、路由RouteSelector,真正的使用时在后面的连接和请求过程中,这里主要是实例化和释放
@Override public Response intercept(Chain chain) throws IOException {Request request = chain.request();// 用来管理connections、stream、routerSelector的类streamAllocation = new StreamAllocation(client.connectionPool(), createAddress(request.url()), callStackTrace);// 记录重试的次数int followUpCount = 0;// 如果发生了重试的话,记录上一次resposneResponse priorResponse = null;while (true) {if (canceled) {streamAllocation.release();throw new IOException("Canceled");}Response response = null;boolean releaseConnection = true;try {// 真正的网络请求response = ((RealInterceptorChain) chain).proceed(request, streamAllocation, null, null);releaseConnection = false;} catch (RouteException e) {// The attempt to connect via a route failed. The request will not have been sent.if (!recover(e.getLastConnectException(), false, request)) {throw e.getLastConnectException();}releaseConnection = false;continue;} catch (IOException e) {// An attempt to communicate with a server failed. The request may have been sent.boolean requestSendStarted = !(e instanceof ConnectionShutdownException);// 某些异常,如ssl握手异常、鉴权异常等不进行重试if (!recover(e, requestSendStarted, request)) throw e;releaseConnection = false;continue;} finally {// We're throwing an unchecked exception. Release any resources.if (releaseConnection) {streamAllocation.streamFailed(null);streamAllocation.release();}}// Attach the prior response if it exists. Such responses never have a body.if (priorResponse != null) {response = response.newBuilder().priorResponse(priorResponse.newBuilder().body(null).build()).build();}// 处理特定的HTTP code,如代理鉴权、重定向等Request followUp = followUpRequest(response);// 如果不需要重试,返回结果if (followUp == null) {if (!forWebSocket) {streamAllocation.release();}return response;}closeQuietly(response.body());// 限制重试次数if (++followUpCount > MAX_FOLLOW_UPS) {streamAllocation.release();throw new ProtocolException("Too many follow-up requests: " + followUpCount);}if (followUp.body() instanceof UnrepeatableRequestBody) {streamAllocation.release();throw new HttpRetryException("Cannot retry streamed HTTP body", response.code());}// 如果重试的host等发生改变,如代理,重定向等情况,重新实例化StreamAllocationif (!sameConnection(response, followUp.url())) {streamAllocation.release();streamAllocation = new StreamAllocation(client.connectionPool(), createAddress(followUp.url()), callStackTrace);} else if (streamAllocation.codec() != null) {throw new IllegalStateException("Closing the body of " + response+ " didn't close its backing stream. Bad interceptor?");}request = followUp;priorResponse = response;}
}
————————————————
本文为CSDN博主「冯小刀」的原创文章
原文链接:https://blog.csdn.net/fengrui_sd/article/details/79004691
okHttp重试机制相关推荐
- android网络重试机制,okhttp源码解析(四):重试机制
前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...
- okhttp源码解析(四):重试机制
前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...
- Retrofit+Rxjava服务器IP轮询重试机制实现
为了保证客户端稳定性和网络容错性,提升用户体验,在客户端建立服务端IP轮询及重试机制是十分有必要的,本文为我个人经验总结,希望对你能有参考价值. app在启动时会请求一些配置信息,其中就包括ip的路由 ...
- loadingcache 有重试机制吗_重试机制的实现
服务在请求资源,如果遇到网络异常等情况,导致请求失败,这时需要有个重试机制来继续请求. 常见的做法是重试3次,并随机 sleep 几秒. 业务开发的脚手架,HTTP Client 基本会封装好 ret ...
- springboot 整合retry(重试机制)
当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...
- Spring Cloud Gateway重试机制
前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊 ...
- 一文读懂熔断器和重试机制
导语:随着微服务的流行,熔断作为其中一项很重要的技术也广为人知.当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机.本文作者介绍了熔断 ...
- invalid signature 错误原因验签失败_Nginx 失败重试机制
可直接点击上方蓝字 (网易游戏运维平台) 关注我们,获一手游戏运维方案 src 网易游戏 SRE,喜欢钻研与分享. 背景 Nginx 作为目前应用较广的反向代理服务,原生提供了一套失败重试机制,来保证 ...
- HttpClientFactory 结合 Polly 轻松实现重试机制
HttpClientFactory 结合 Polly 轻松实现重试机制 Intro 我们的服务里有一个 API 会去调用第三方的接口,设置了超时时间,最近偶尔会发生超时的情况,微软在提供 HttpCl ...
最新文章
- Unity3D小功能 小技巧 小教程 小原理(持续更新...)
- 参考-这个符号在PHP中是什么意思?
- 移动端1px像素的设置?
- HTML5 input元素新的特性
- mysql mongodb 集群_MySQL与MongoDB
- VTK:PolyData之HighlightBadCells
- iPhone iPad 各种控件默认高度
- 数据结构-- 线性表之链式存储
- 【数据结构基础】-串-顺序结构的基本操作实现
- 内部类 java 1614957119
- c语言输出数字菱形北京理工大学,C语言程序的设计—北京理工大学MOOC提交作业.docx...
- [转载] JAVA从菜鸟【入门】到新手【实习】一一一一Python 内置函数,标准库与第三方库(拓展库),常用框架
- err=etherbase address must be explicitly specified
- c语言开发kafka环境,c++(11)使用librdkafka库实现kafka的消费实例
- 基于Springboot+MYSQL实现在线点餐系统源码
- 让读书的人面上有光:亚马逊Kindle青春版上市
- 【Python】unittest中执行用例通过但是报错:OSError: [WinError 6] 句柄无效。
- Python_美多商城(验证码)_3
- 计算机新技术在体育中的应用,计算机虚拟现实技术在体育训练的应用
- 为什么有的人明明能力没问题,却总是抓不住升职加薪的机会?