java http超时重连_httpclient 重连机制
我们在进行http请求时,难免会遇到请求失败的情况,失败后需要重新请求,尝试再次获取数据。
Apache的HttpClient提供了异常重试机制,在该机制中,我们可以很灵活的定义在哪些异常情况下进行重试。
今天有个小伙伴,遇到了这样的问题,后来是通过此方法去解决的,
一个爬虫,他请求超过了多少次,自动就超时了,目前还没有找得到具体原因,不过用这个重连机制是完美解决了问题的。好了,代码如下:
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import javax.net.ssl.SSLException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class HttpPostUtils {
public String retryPostJson(String uri, String json, int retryCount, int connectTimeout,
int connectionRequestTimeout, int socketTimeout) throws IOException, ParseException {
if (StringUtils.isAnyBlank(uri, json)) {
return null;
}
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
if (executionCount > retryCount) {
// Do not retry if over max retry count
return false;
}
if (exception instanceof InterruptedIOException) {
// An input or output transfer has been terminated
return false;
}
if (exception instanceof UnknownHostException) {
// Unknown host 修改代码让不识别主机时重试,实际业务当不识别的时候不应该重试,再次为了演示重试过程,执行会显示retryCount次下面的输出
System.out.println("不识别主机重试"); return true;
}
if (exception instanceof ConnectException) {
System.out.println("连接超时,正在重新请求ing...."); return true;
}
if (exception instanceof SSLException) {
// SSL handshake exception
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}
return false;
}
};
CloseableHttpClient client = HttpClients.custom().setRetryHandler(httpRequestRetryHandler).build();
HttpPost post = new HttpPost(uri);
// Create request data
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
// Set request body
post.setEntity(entity);
RequestConfig config = RequestConfig.custom().setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).build();
post.setConfig(config);
// Response content
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(post, HttpClientContext.create());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
responseContent = EntityUtils.toString(response.getEntity(), Consts.UTF_8.name());
}
} finally {
if (ObjectUtils.anyNotNull(response)) {
response.close();
}
if (ObjectUtils.anyNotNull(client)) {
client.close();
}
}
return responseContent;
}
java http超时重连_httpclient 重连机制相关推荐
- java文件移动重命名_Java重命名文件和移动文件
Java重命名文件或移动文件是一种常见的IO操作.可以使用File.renameTo(File dest)方法进行重命名文件和移动文件操作. 1. Java重命名文件 如果文件重命名成功,则文件ren ...
- java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...
eclipse包资源管理器java项目,包,类重命名,对于修改已知创建的包(包括java项目,java包)和java类文件的命名非常重要的,有时候你的java包里有多个java文件,你要改名字,可以说 ...
- 《Java小子怒闯数据结构九重天》第三重天——栈
本专栏文章主要用于帮助Java使用者快速上手数据结构,刷算法题! 前言 自古以来数据结构界就分为九重天,据说冲破这九重天之后就可以去进攻算法界最终修炼最后成佬,受万人敬仰. 但是这谈何容易,因为每一重 ...
- 《Java小子怒闯数据结构九重天》第二重天——字符串
本专栏文章主要用于帮助Java使用者快速上手数据结构,刷算法题! 前言 自古以来数据结构界就分为九重天,据说冲破这九重天之后就可以去进攻算法界最终修炼最后成佬,受万人敬仰. 但是这谈何容易,因为每一重 ...
- 第十二届蓝桥杯省赛 Java 大学 B 组—砝码称重—满分百分题解
第十二届蓝桥杯省赛 Java 大学 B 组-砝码称重-满分百分题解 一.解题思路 1.解法一( Java ) 解法思路:简单模拟 ☝ArrayList 遍历 + HashSet 存储(去重) 伪代码如 ...
- Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此. 什么是重排序? 重排序指的是编译器.处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率. 重 ...
- Java内存模型深度解析:重排序 --转
原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...
- java 偏向锁 重偏向_偏向锁的【批量重偏向与批量撤销】机制
前言 从网上看了很多批量重偏向与批量撤销的介绍,但都一知半解,本着钻研的精神,使用数据进行分析批量重偏向与批量撤销的工作机制. 准备 首先,要先知道偏向锁的偏向锁机制,着重看下撤销机制. 然后,要知道 ...
- mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...
MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...
最新文章
- Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
- 简析正则表达式的使用
- 无法加载资源,因为“应用程序传输安全性”策略要求使用安全连接
- APT案例之点击事件
- linux tomcat 进程杀掉_Linux下Tomcat的启动、关闭、杀死进程
- wxWidgets:wxOwnerDrawnComboBox类用法
- 昂贵的聘礼 Dijkstra法
- guid判断是否有效_让我们一起啃算法----有效的括号
- 关于在asp.net中textbox文本输入框中的汉语标点符号显示位置的问题
- Matlab Tricks( 八)—— 将 pgm 格式文件转换为 png 格式
- 麦肯锡:数字化转型四步法!
- verilog语法基础
- java生成数据库三线表
- MongoDB学习笔记
- 计算机扫描服务是哪一项,电脑右键没有扫描选项怎么办 方法其实很简单
- 刨根系列之volatile详解
- Windows下批量查找文件
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
- PHP实现 记录网站访问量
- Win11如何更改字体样式?Win11更改字体样式的方法