`
fighter1945
  • 浏览: 230867 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HttpRequestRetryHandler 重写的一个小坑

阅读更多
HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {

    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
            return false;
        }
        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(myRetryHandler)
        .build();

 

https://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html

不知道有多少人在重写HttpRequestRetryHandler 的时候直接copy了官网的这段代码,然后修改

结果综合测试里,get可以retry没问题,post死活过不了

查了几个小时后,终于发现在1.4.2里有以下说明

 

HttpClient assumes non-entity enclosing methods such as GET and HEAD to be idempotent and entity enclosing methods such as POST and PUT to be not.

 

一切恍然大悟

删掉以下代码,直接返回true进行retry即可

 

        HttpClientContext clientContext = HttpClientContext.adapt(context);
        HttpRequest request = clientContext.getRequest();
        boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
        if (idempotent) {

 

 

分享到:
评论

相关推荐

    微信小程序 重写App、重写Page 自定义分享

    在微信小程序开发中,"重写App、重写Page与自定义分享"是常见的需求,它们涉及到小程序的基础架构和用户体验优化。以下将详细介绍这些概念及其应用。 **重写App** `App`是微信小程序的全局应用程序对象,它包含了...

    URL重写的一个例子

    在提供的压缩包`UrlReWriterModel`中,很可能包含了实现URL重写的一个模型或示例代码。这个模型可能包括了配置文件、URL重写规则以及对应的控制器或处理程序。例如,如果这是一个ASP.NET的示例,`web.config`文件里...

    UrlWriter实现url重写的一个实例

    2. **UrlWriter的作用**:UrlWriter是一个特定的工具,它可能是一个类库、框架的一部分,或者是服务器配置文件中的指令集,负责解析和构建重写后的URL。使用UrlWriter,开发者可以定义一系列规则来控制URL的格式。 ...

    asp.net c# Url重写和无扩展名Url重写

    URL重写是一种机制,它允许开发人员将一个URL映射到另一个URL,而不会改变实际请求的资源。在ASP.NET中,这通常通过使用IIS(Internet Information Services)的URL重写模块或者Microsoft的`System.Web.Routing`类库...

    jsp的一个url重写

    在探讨“jsp的一个url重写”这一主题时,我们深入解析了达内郑州中心老师分享的关于URL重写的实现方式,这不仅展示了JSP技术在动态网页开发中的灵活性,也揭示了URL重写在提高用户体验、优化SEO以及简化URL结构方面...

    Url重写示例(无后缀Url重写)

    Url重写是Web开发中的一个重要概念,主要用于优化和管理网站的网址结构,使其更符合搜索引擎优化(SEO)标准,同时也可提升用户体验。无后缀Url重写是指在URL中不显示传统的文件扩展名,如.aspx、.html等,使网址看...

    C# url重写 C# url重写

    IIS URL重写模块是一个可下载的扩展,可以直接在IIS服务器上安装。在C#中,我们可以在web.config配置文件中编写重写规则。例如,以下规则将`/oldpage.aspx`重定向到`/newpage`: ```xml ^oldpage\.aspx$" /...

    url重写工具,重写二级域名

    描述中的“.net重写url的工具”进一步确认了我们正在讨论的是一个专门针对.NET环境的URL重写解决方案。 URL重写在现代Web开发中扮演着关键角色,因为它有助于提高用户体验,改善搜索引擎优化(SEO),并使网站保持...

    C#重写MessageBox对话框

    C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框

    c#重写的tabcontrol控件

    1. **自定义控件的外观**:在C#中,可以创建一个继承自TabControl的类,然后覆盖OnPaint方法。在这个方法里,你可以使用Graphics对象绘制自己的控件样式,例如改变选中标签的颜色、形状、边框等。同时,可以利用...

    重写window.alert方法

    在JavaScript编程中,`window.alert()` 是一个内置的全局函数,用于向用户显示警告对话框,通常包含一条消息和一个“确定”按钮。这个方法在网页开发中常用于简单的信息提示,但有时开发者可能需要自定义其行为,...

    java中的url重写

    Java 中的 URL 重写是一种常用的技术,它可以将原始的 URL 转换为另一个 URL,以便达到特定的目的。例如,隐藏真实的 URL、实现 URL 的加密、实现 URL 的重定向等。在 Java 中,有多种方式可以实现 URL 重写,包括...

    c# 多个ListView重写控件

    本篇文章将围绕“C# 多个ListView重写控件”这一主题,详细介绍如何实现一个更加易用且功能丰富的ListView。 首先,`A Much Easier to Use ListView - CodeProject.mht`文件可能是一个关于改进ListView的代码项目...

    重写的一个heart程序

    【标题】:“重写的一个heart程序” 在编程领域,重写一个程序通常意味着对原有的代码进行重构,以改进其设计、性能或者兼容性。在这个案例中,提到的是一个名为“heart”的程序,它最初可能是由你的高中同桌在...

    Java重写.docx

    System.out.println("先定义小目标,挣他一个亿..."); return null; } static void test() { System.out.println("父类静态方法"); } } class SiCong extends JianLin { String name = "王思聪"; @...

    URL重写动态链接库

    在ASP.NET开发中,URL重写是一个非常重要的技术,它能帮助我们创建更美观、更具SEO优化的URL,同时也有助于系统架构的优化。本文将深入探讨“URL重写动态链接库”的相关知识点,包括URL重写的基本概念、工作原理、...

    URL重写实例,无二级重写

    URL重写是Web开发中的一个重要概念,主要用于优化网站的URL结构,提高用户体验并有利于搜索引擎优化(SEO)。在ASP.NET环境中,Microsoft提供了URL重写模块,使得开发者能够方便地实现URL的美化和管理。本实例主要...

    IISURL重写组件

    在IIS中,URL重写组件是一个非常关键的工具,它允许管理员根据预定义的规则改变请求的URL,从而优化网站的SEO(搜索引擎优化),改善用户体验,以及实现各种高级路由策略。 **一、URL重写的概念** URL重写是指将...

    ASP.NETweb网站Url重写,地址栏重写

    例如,创建一个Global.asax.cs文件并在`Application_BeginRequest`方法中添加重写逻辑: ```csharp protected void Application_BeginRequest(object sender, EventArgs e) { var context = HttpContext.Current; ...

    C#实现按钮Button的重写

    通过以上步骤,我们成功地在C#中实现了按钮控件的重写,创建了一个具有独特外观和行为的“漂亮”按钮。这样的自定义按钮可以根据项目需求进行各种定制,提升用户体验,同时使代码更具可维护性和可扩展性。

Global site tag (gtag.js) - Google Analytics