文档章节

HttpClient异常重试

杨小杨
 杨小杨
发布于 2016/04/08 13:44
字数 573
阅读 681
收藏 8

1、 HttpClient异常重试

       当请求发生异常时,通过异常处理机制自动重新请求。

2、前提:

      被请求的方法必须是幂等的:就是多次请求服务端结果应该是准确且一致的。
      适合的方法:比如根据ID,修改人员姓名,无论请求多次结果都是一样,这就是幂等。
       不适合的方法:比如减少账号50元,多次请求将多次扣减,

3、实现方式:

     想要实现异常重试,需要实现它提供的一个接口 HttpRequestRetryHandler,并实现retryRequest方法。
   然后set到HttpClient中。该httpClient就具备了重试机制

4、HttpClient提供了标准和默认两个实现类

  4.1 StandardHttpRequestRetryHandler

    该类默认几个方法为幂等,如PUT,GET,HEAD等POST外的方法,如果自定义可以参考他的实现方式,

  4.2  DefaultHttpRequestRetryHandler

          略

5、demo

    本文为了演示重试机制,自定义了一个本文通过自定义一个实现类,为了让大家看到重试的效果,将不识别的主机异常,让它重试,代码如下,

    在实现的 retryRequest方法中,遇到不识别主机异常,返回true,请求将重试。最多重试请求5次

package httpcomponents;

import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.impl.client.*;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLException;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException;

/**
* Created by shuangjun.yang on 2016/4/1.
*/
public class HttpRetryCustomTest {
    public static void main(String[] args){
        HttpRequestRetryHandler httpRequestRetryHandle = new StandardHttpRequestRetryHandler(1,false);
        HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
            @Override
            public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
                if (executionCount >= 5) {
                    // Do not retry if over max retry count
                    return false;
                }
                if (exception instanceof InterruptedIOException) {
                    // Timeout
                    return false;
                }
                if (exception instanceof UnknownHostException) {
                    // Unknown host  修改代码让不识别主机时重试,实际业务当不识别的时候不应该重试,再次为了演示重试过程,执行会显示5次下面的输出
                    System.out.println("不识别主机重试");  
                    return true;
                }
                if (exception instanceof ConnectTimeoutException) {
                    // Connection refused
                    return false;
                }
                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 httpClient = HttpClients.custom()
                .setRetryHandler(httpRequestRetryHandler)
                .build();
        HttpGet httpGet = new HttpGet("http://www.begincodee.net");  //不存在的域名
        try {
            HttpResponse response =  httpClient.execute(httpGet, HttpClientContext.create());
            HttpEntity entity = response.getEntity();
            System.out.println(EntityUtils.toString(entity));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



本文转载自:http://www.begincode.net/blog/101

杨小杨
粉丝 22
博文 43
码字总数 11499
作品 0
昌平
程序员
私信 提问
Asp.Net Core 轻松学-HttpClient的演进和避坑

前言     在 Asp.Net Core 1.0 时代,由于设计上的问题, HttpClient 给开发者带来了无尽的困扰,用 Asp.Net Core 开发团队的话来说就是:我们注意到,HttpClient 被很多开发人员不正确的...

Ron.liang
2018/12/08
0
0
关于HttpClient重试策略的研究

原文出处:kingszelda 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题:...

kingszelda
2018/04/25
0
0
Apache Client使用说明第一章(第二部分)

1.2 HttpClient接口 HttpClient接口代表了HTTP请求执行最重要的约定.它规定了请求执行过程无任何和限制或者特定的细节以及审阅连接管理,状态管理,认证和重定向处理的实现等细节.这使得装饰接...

第五郎
2015/11/05
0
0
httpclient4.4 出现NoHttpResponseException的异常解决

httpclient4.4简单初始化httpclient的方式: 使用连接池初始化httpclient的方式: 但在测试过程中发现,有时候出现如下的异常,但重试一次就没有问题: 网上查了相关的报错信息,找到官网上的...

一路向北的兔斯基
2015/07/30
0
1
HttpClient及有关jar包详解

1.HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本...

长平狐
2012/11/12
12.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

《生活的难题》的读后感3600字范文

《生活的难题》的读后感3600字范文: 假如我们对丑的事物也能够像对待美的事物那般抱持一种开放、接纳的心态,拥有相同的感受力,那么我们便会发现它们都是充满意义的,而这种认识会使生活变...

原创小博客
12分钟前
1
0
Linux learn(四)

7. Linux磁盘与文件系统管理 文件系统通常会将数据放在不同的区块,权限与属性放置到inode中,至于实际数据则放到datab lock区块中,另外,还有一个超级区块(superblock)会记录整个文件系统...

lazy~
20分钟前
1
0
微信公众号开发(四)

微信公众号开发时常需要一个用户授权绑定的过程。关于微信公众号的用户绑定,一般有如下两种实现方式: (1)通过发送短信验证码的方式; (2)使用用户登录时,向后端传递openid的方式。 使...

织梦之魂
今天
3
0
设计模式-工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端...

HOT_POT
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部