我们在进行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 重连机制相关推荐

  1. java文件移动重命名_Java重命名文件和移动文件

    Java重命名文件或移动文件是一种常见的IO操作.可以使用File.renameTo(File dest)方法进行重命名文件和移动文件操作. 1. Java重命名文件 如果文件重命名成功,则文件ren ...

  2. java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...

    eclipse包资源管理器java项目,包,类重命名,对于修改已知创建的包(包括java项目,java包)和java类文件的命名非常重要的,有时候你的java包里有多个java文件,你要改名字,可以说 ...

  3. 《Java小子怒闯数据结构九重天》第三重天——栈

    本专栏文章主要用于帮助Java使用者快速上手数据结构,刷算法题! 前言 自古以来数据结构界就分为九重天,据说冲破这九重天之后就可以去进攻算法界最终修炼最后成佬,受万人敬仰. 但是这谈何容易,因为每一重 ...

  4. 《Java小子怒闯数据结构九重天》第二重天——字符串

    本专栏文章主要用于帮助Java使用者快速上手数据结构,刷算法题! 前言 自古以来数据结构界就分为九重天,据说冲破这九重天之后就可以去进攻算法界最终修炼最后成佬,受万人敬仰. 但是这谈何容易,因为每一重 ...

  5. 第十二届蓝桥杯省赛 Java 大学 B 组—砝码称重—满分百分题解

    第十二届蓝桥杯省赛 Java 大学 B 组-砝码称重-满分百分题解 一.解题思路 1.解法一( Java ) 解法思路:简单模拟 ☝ArrayList 遍历 + HashSet 存储(去重) 伪代码如 ...

  6. Java并发编程的艺术(二)——重排序

    当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此. 什么是重排序? 重排序指的是编译器.处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率. 重 ...

  7. Java内存模型深度解析:重排序 --转

    原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...

  8. java 偏向锁 重偏向_偏向锁的【批量重偏向与批量撤销】机制

    前言 从网上看了很多批量重偏向与批量撤销的介绍,但都一知半解,本着钻研的精神,使用数据进行分析批量重偏向与批量撤销的工作机制. 准备 首先,要先知道偏向锁的偏向锁机制,着重看下撤销机制. 然后,要知道 ...

  9. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

最新文章

  1. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
  2. 简析正则表达式的使用
  3. 无法加载资源,因为“应用程序传输安全性”策略要求使用安全连接
  4. APT案例之点击事件
  5. linux tomcat 进程杀掉_Linux下Tomcat的启动、关闭、杀死进程
  6. wxWidgets:wxOwnerDrawnComboBox类用法
  7. 昂贵的聘礼 Dijkstra法
  8. guid判断是否有效_让我们一起啃算法----有效的括号
  9. 关于在asp.net中textbox文本输入框中的汉语标点符号显示位置的问题
  10. Matlab Tricks( 八)—— 将 pgm 格式文件转换为 png 格式
  11. 麦肯锡:数字化转型四步法!
  12. verilog语法基础
  13. java生成数据库三线表
  14. MongoDB学习笔记
  15. 计算机扫描服务是哪一项,电脑右键没有扫描选项怎么办 方法其实很简单
  16. 刨根系列之volatile详解
  17. Windows下批量查找文件
  18. 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
  19. PHP实现 记录网站访问量
  20. Win11如何更改字体样式?Win11更改字体样式的方法

热门文章

  1. 在服务器上安装anaconda遇到的问题总结
  2. 知识图谱与智能问答基础理解
  3. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之环境配置
  4. (4.14)向上取整、向下取整、四舍五入取整的实例
  5. javascript如何处理很多数据,类似分页切换
  6. HDU 4431 Mahjong(模拟题)
  7. .net 中使用socket (c#)
  8. [转]该学Java或.NET?
  9. linux的基础知识——进程组
  10. 计算机网络(十二)-信道划分介质访问控制-信道复用