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重试机制相关推荐

  1. android网络重试机制,okhttp源码解析(四):重试机制

    前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...

  2. okhttp源码解析(四):重试机制

    前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...

  3. Retrofit+Rxjava服务器IP轮询重试机制实现

    为了保证客户端稳定性和网络容错性,提升用户体验,在客户端建立服务端IP轮询及重试机制是十分有必要的,本文为我个人经验总结,希望对你能有参考价值. app在启动时会请求一些配置信息,其中就包括ip的路由 ...

  4. loadingcache 有重试机制吗_重试机制的实现

    服务在请求资源,如果遇到网络异常等情况,导致请求失败,这时需要有个重试机制来继续请求. 常见的做法是重试3次,并随机 sleep 几秒. 业务开发的脚手架,HTTP Client 基本会封装好 ret ...

  5. springboot 整合retry(重试机制)

    当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...

  6. Spring Cloud Gateway重试机制

    前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊 ...

  7. 一文读懂熔断器和重试机制

    导语:随着微服务的流行,熔断作为其中一项很重要的技术也广为人知.当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机.本文作者介绍了熔断 ...

  8. invalid signature 错误原因验签失败_Nginx 失败重试机制

    可直接点击上方蓝字 (网易游戏运维平台) 关注我们,获一手游戏运维方案 src 网易游戏 SRE,喜欢钻研与分享. 背景 Nginx 作为目前应用较广的反向代理服务,原生提供了一套失败重试机制,来保证 ...

  9. HttpClientFactory 结合 Polly 轻松实现重试机制

    HttpClientFactory 结合 Polly 轻松实现重试机制 Intro 我们的服务里有一个 API 会去调用第三方的接口,设置了超时时间,最近偶尔会发生超时的情况,微软在提供 HttpCl ...

最新文章

  1. Unity3D小功能 小技巧 小教程 小原理(持续更新...)
  2. 参考-这个符号在PHP中是什么意思?
  3. 移动端1px像素的设置?
  4. HTML5 input元素新的特性
  5. mysql mongodb 集群_MySQL与MongoDB
  6. VTK:PolyData之HighlightBadCells
  7. iPhone iPad 各种控件默认高度
  8. 数据结构-- 线性表之链式存储
  9. 【数据结构基础】-串-顺序结构的基本操作实现
  10. 内部类 java 1614957119
  11. c语言输出数字菱形北京理工大学,C语言程序的设计—北京理工大学MOOC提交作业.docx...
  12. [转载] JAVA从菜鸟【入门】到新手【实习】一一一一Python 内置函数,标准库与第三方库(拓展库),常用框架
  13. err=etherbase address must be explicitly specified
  14. c语言开发kafka环境,c++(11)使用librdkafka库实现kafka的消费实例
  15. 基于Springboot+MYSQL实现在线点餐系统源码
  16. 让读书的人面上有光:亚马逊Kindle青春版上市
  17. 【Python】unittest中执行用例通过但是报错:OSError: [WinError 6] 句柄无效。
  18. Python_美多商城(验证码)_3
  19. 计算机新技术在体育中的应用,计算机虚拟现实技术在体育训练的应用
  20. 为什么有的人明明能力没问题,却总是抓不住升职加薪的机会?

热门文章

  1. 精明的程序员——爱学习
  2. 荒谬!高校院长在Nature论文一作位置P上自己名字,还写到简历里...
  3. Ubuntu中使用的python编辑器Atom
  4. ## 学会使用Wireshark网络监听 设置代理服务器
  5. 张鑫旭数组方法总结收录
  6. 登高自卑 | 我的Vue3入门与实践笔记
  7. 荧光光谱入门:荧光光谱基础(一)
  8. Hue整合HBase
  9. 细胞工程-动物细胞工程-3- 动物细胞培养技术-1
  10. 微信433天之内完成用户数从零到一亿的增长过程