温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何解决NoHttpResponse failed to respond问题

发布时间:2021-09-18 09:43:57 来源:亿速云 阅读:1451 作者:柒染 栏目:编程语言

这篇文章给大家介绍如何解决NoHttpResponse failed to respond问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

项目运行中遇到接口报错org.apache.http.NoHttpResponseException:  xxxx.com:80 failed to respond 报错,报错无规律出现,使用用postMan 等工具测试接口都正常,项目调试中无法重现报错,但生产环境中会有该错误产生。

服务端是springBoot 项目,客户端是SpringMvc

分析:使用postMan或者手写Test调用接口无异常,那么和项目中存在的差异在哪呢?从引入的包开始分析,发现使用httpClient版本均一致,忽然想到,项目中为了性能,是启用了连接池的,会不会是服务端主动关闭了连接,客户端不知道,仍然使用这个链接

验证:客户端建立连接->服务端手动关闭连接->客户端调用接口  宾狗  报错出来了

结论:服务端和客户端的keepAliveTimeOut 不一致,导致服务端先于客户端关闭了链接,而客户端仍然使用该连接,导致报错

解决:

    方案1.  服务端设置keepAliveTimeOut 时间与客户端一致

    方案2. 客户端配置ConnectionKeepAliveStrategy  代码如下:

ConnectionKeepAliveStrategy strategy = new ConnectionKeepAliveStrategy() {@Override    public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
        Args.notNull(response, "HTTP response");        final HeaderElementIterator it = new BasicHeaderElementIterator(
                response.headerIterator(HTTP.CONN_KEEP_ALIVE));        while (it.hasNext()) {final HeaderElement he = it.nextElement();            final String param = he.getName();            final String value = he.getValue();            if (value != null && param.equalsIgnoreCase("timeout")) {try {return Long.parseLong(value) * 1000;                } catch (final NumberFormatException ignore) {
                }
            }
        }return 1;    }
};
HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager)
        .setConnectionManagerShared(true)
        .setKeepAliveStrategy(myStrategy)
        .build()

关于如何解决NoHttpResponse failed to respond问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI