如何解决NoHttpResponsefailedtorespond问题

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

环翠网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

项目运行中遇到接口报错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问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


文章名称:如何解决NoHttpResponsefailedtorespond问题
本文路径:http://scyanting.com/article/pggidd.html