`
fighter1945
  • 浏览: 229070 次
  • 性别: 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`类库...

    URL重写URL重写

    这段代码开启重写引擎,当请求以`news/`开头且后面跟着一个数字的URL时,会将请求重定向到`index.php?id=`加上匹配到的数字。 六、URL重写注意事项 1. 避免循环重定向:确保规则设置正确,防止URL被无限重写。 2. ...

    URL重写URL重写URL重写URL重写

    URL重写是Web开发中的一种技术,主要用于优化和管理网站的URL结构,使其更符合搜索引擎优化(SEO)标准,提高用户体验,并便于服务器管理和应用程序处理。...正确配置和理解URL重写规则是每个Web开发者必备的技能之一。

    URL重写URL重写URL重写

    当用户通过浏览器输入一个经过重写的URL时,服务器会通过特定规则将这个友好的URL解析为实际处理请求的URL,然后进行相应的服务响应。这一过程通常涉及到HTTP服务器的配置文件,如Apache的`.htaccess`文件或IIS的web...

    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对象绘制自己的控件样式,例如改变选中标签的颜色、形状、边框等。同时,可以利用...

    URL重写DEMOURL重写DEMO

    URL重写是Web开发中的一个重要概念,主要用于优化网站的URL结构,提高用户体验,以及更好地适应搜索引擎优化(SEO)的需求。在ASP.NET环境中,一个常用的URL重写库是UrlRewriting.Net,它允许开发者通过配置规则来...

    重写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 = "王思聪"; @...

    C#实现按钮Button的重写

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

Global site tag (gtag.js) - Google Analytics