您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何解決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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。