OKHTTP 如何处理请求超时和重连机制

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

请求超时配置

在 OkhttpClient 中有默认的一些配置,比如连接池、超时时间、写入时间、读取时间等。我们可以通过查看OkhttpClient源码得知。
在这里插入图片描述
默认配置如下:

  • 连接超时时间:默认为10秒
  • 写入超时时间:默认为10秒
  • 读取超时时间:默认为10秒
  • Follow Redirects(重定向):默认为 true,即会自动遵循重定向
  • 连接池大小:默认为5个
  • 重试次数:默认为0,即 不会自动重试请求。
    但是默认配置不能满足日常需要,如何进行自定义呢,可使用 OkHttpClient.Builder() 来定制化配置。具体如下:
ConnectionPool connectionPool = new ConnectionPool(5,5, TimeUnit.MINUTES);
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS) //连接超时时间.writeTimeout(30,TimeUnit.SECONDS) //设置写入超时时间.readTimeout(30,TimeUnit.SECONDS).followRedirects(false) //禁用重定向.connectionPool(connectionPool).build();

使用 OkHttpClient.Builder() 构建 OkHttpClient 对象,并且可以通过调用 builder 的方法来配置 OkHttpClient。
上述我们还定制化了连接池,

// 创建一个连接池,最大空闲连接数为5,每个连接最大保持时间为5分钟
ConnectionPool connectionPool = new ConnectionPool(5,5, TimeUnit.MINUTES);

在这里插入图片描述

  • maxIdleConnections:最大空闲连接数。
  • keepAliveDuration:连接保持时间。

OkHttp 会自动管理连接池中的连接,根据需要重用已经存在的连接或创建新的连接。连接池会根据连接的空闲时间来关闭不再需要的连接,以节省资源。

重连机制

在 Okhttp 中不直接提供内置的重连机制,可以通过自定义Interceptor 来实现请求失败时的重试逻辑,这块涉及到拦截器的应用,具体使用如下:

package com.qiniu.interceptortest;
import androidx.annotation.NonNull;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.*;public class ReConnectionTest {public static void main(String[] args) {OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new RetryInterceptor(3)).build();//创建请求Request request = new Request.Builder().url("http://www.baidu.com").build();// 使用 OkHttpClient 实例来发送请求,并处理响应。client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {System.out.println("Request failed: " + e.getMessage());}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {// 处理响应数据if (response.isSuccessful()) {String responseData = response.body().string();System.out.println(responseData);// 处理响应数据} else {// 处理失败响应}}});}static class RetryInterceptor implements Interceptor{private int maxRetries;private int retryCount = 0;public RetryInterceptor(int maxRetries) {this.maxRetries = maxRetries;}@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {Request request = chain.request();Response response = chain.proceed(request);while (!response.isSuccessful() && retryCount < maxRetries){retryCount++;response = chain.proceed(request);}return response;}}
}

通过拦截器来实现重连机制,拦截器用于在发送请求和接收响应的过程中拦截、修改和处理请求和响应数据。拦截器允许开发人员在网络请求的不同阶段介入,并对请求和响应进行各种操作,如修改请求头、记录日志、重试请求、添加认证信息等。

人生像一部电影,有些人就像弹出来的广告

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

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

相关文章

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

VS+QT 自定义插件变成动态库加载及使用

一、前言 有个界面需要重复使用某个自定义的控件&#xff0c;希望自定义控件能够像动态库文件那样&#xff0c;添加引用lib就能使用&#xff0c;经过多次太坑后&#xff0c;总结如下 二、实现方式 ① 新建项目&#xff0c;选择"Qt Designer Custom Widget" 创建自定…

Kubernetes(k8s) 与 docker 间 镜像导入

docker 导出&#xff0c;k8s 导入 docker 镜像导出 查看镜像 docker images结果 REPOSITORY TAG IMAGE ID CREATED SIZE openjdk jz23 092ed76962fb 3 hours ago 694MB导出镜…

python爬虫 - 进阶正则表达式

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 &#xff08;一&#xff09;匹配单个中文字符 &#xff08;二…

JavaEE-进程与线程

1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运 ⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的&#xff0c;进程可 以说是计算机科学…

【动态规划】子数组系列(上)

1. 最大子数组和 53. 最大子数组和 状态表示&#xff1a;以 i 位置为结尾时的所有子数组中的最大和 状态转移方程&#xff1a; i 位置为结尾的子数组又可以分为长度为 1 的和大于 1 的&#xff0c;长度为 1 就是 nums[i] &#xff0c;长度不为 1 就是 dp[i - 1] nums[i]&…

Javascript笔试题目(三)

1.如何使用JS实现setTimeout功能来模拟setlnterva请写出具体代码 在JavaScript中&#xff0c;setTimeout 和 setInterval 是两个常用的定时器函数&#xff0c;但它们的行为有所不同。setTimeout 用于在指定的延迟后执行一次代码&#xff0c;而 setInterval 则用于每隔指定的时…

Ubuntu中vscode如何选择ROS版本

Ubuntu中可能安装了多个ROS版本&#xff0c;比如ROS1 noetic&#xff0c; ROS2 foxy, humble等。有时候需要在vscode中对ROS程序进行debug&#xff0c;一般会先安装ROS插件。当电脑上有多个ROS版本时&#xff0c;选择Debug中选择ROS&#xff1a;Launch ROS:Attach(ROS1)或者ROS…

Prometheus + Grafana 监控 MySQL 数据库

文章目录 1、前置介绍2、搭建流程2.1、安装 Docker2.2、安装 MySQL2.3、安装 MySQL Exporter2.4、安装 Prometheus2.5、安装 Grafana 1、前置介绍 本次监控平台搭建&#xff0c;我使用2台阿里云服务器来完成本次的搭建部署操作&#xff0c;配置如下&#xff1a; 阿里云ECS1&am…

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

Word文档功能快捷键大全

以下是 Microsoft Word 的全面快捷键大全&#xff0c;涵盖了文档操作、文本编辑、格式化、导航等多种功能&#xff0c;帮助你提高工作效率。 Word 全面快捷键和快捷方式表 功能类别快捷键/快捷方式功能描述基本文档操作Ctrl N新建文档Ctrl O打开文档Ctrl S保存文档F12另存…

AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题&#xff0c;以及解决思路和代码实现过程。希望…

48 Redis

48 Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操…

[C++][第三方库][RabbitMq]详细讲解

目录 1.介绍2.安装1.RabbitMq2.客户端库 3.AMQP-CPP 简单使用1.介绍2.使用 4.类与接口1.Channel2.ev 5.使用1.publish.cc2.consume.cc3.makefile 1.介绍 RabbitMQ&#xff1a;消息队列组件&#xff0c;实现两个客户端主机之间消息传输的功能(发布&订阅)核心概念&#xff1…

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile

1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载&#xff0c;所以网上找了资源&#xff0c;下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于&#xff1a;Py…

Python读取pdf中的文字与表格

一、PyPDF2包安装 在Python中安装PyPDF2库&#xff0c;您可以使用pip包管理器。打开您的命令行工具&#xff08;例如CMD、Terminal或Anaconda Prompt&#xff09;&#xff0c;然后输入以下命令&#xff1a; pip install PyPDF2 如果您使用的是Python 3&#xff0c;并且系统中…

计算机网络基本架构知识点

1. 网络体系结构模型&#xff1a; - OSI 七层模型&#xff1a; - 物理层&#xff1a;是网络通信的基础层&#xff0c;负责在物理介质上传输比特流。该层定义了物理连接的标准&#xff0c;如电缆的类型、接口的形状、插头的规格等&#xff0c;以及信号的传输方式&#xff0c;包括…

Elasticsearch-数据索引与查询

目录 创建索引 文档的CRUD操作 执行基本查询 使用过滤器 结果排序与分页 多条件组合查询 创建索引 在Elasticsearch中&#xff0c;索引是存储相关数据的地方。它类似于关系型数据库中的表&#xff0c;但具有更强的灵活性和可扩展性。创建一个索引时&#xff0c;可以定义索…

JavaScript进行数据可视化:D3.js入门

在数据驱动的世界中&#xff0c;数据可视化是理解和传达数据信息的重要手段。D3.js是一个强大的JavaScript库&#xff0c;它允许开发者将数据转换为可交互的图形和图表。本文将为您介绍D3.js的基本概念、特点以及如何入门使用它进行数据可视化。 D3.js简介 什么是D3.js&#…

C#_带参数的委托进入队列执行

我们经常会遇到一些函数多个地方调用,但是只能单独执行的就需要把它放到队列中执行。 1.创建对应该方法的委托(传参和回参类型需要一致)。 //委托: public delegate void CameraTaskDelegate(byte cs, ref byte[] buffer);//对应函数: public void CameraSettingRead(by…