这篇文章给大家介绍如何解决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问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。