HttpClient 出现 failed to respond 异常解决

文章目录

现象

httpclient 在使用线程池时,偶尔出现 NoHttpResponseException 异常。

httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond

异常由 httpclient 抛出:
httpcomponents-client/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/HttpRequestRetryExec.java

if (ex instanceof NoHttpResponseException) {
    final NoHttpResponseException updatedex = new NoHttpResponseException(
            route.getTargetHost().toHostString() + " failed to respond");
    updatedex.setStackTrace(ex.getStackTrace());
    throw updatedex;
}

原因

直接原因:服务器收到请求以后,不处理直接丢弃。
实际情况:
1.当服务端由于负载过大等情况发生时,可能会导致在收到请求后无法处理(比如没有足够的线程资源),会直接丢弃链接而不进行处理。此时客户端就会报错:NoHttpResponseException。
解决建议:
重试

2.客户端与服务端建立的请求在服务端已经失效。(例如:服务端 springboot 内置 tomcat 默认 keepAliveTimeout :20s,客户端自定义 keepAliveTimeout :30s,客户端连接池中取出的空闲连接可能已经被服务端失效,再次从连接池拿该失效连接进行请求时,就会报错。)
解决建议:
关闭失效连接(修改关闭空闲连接时间)

解决

1.设置重试策略。

HttpClient httpClient = HttpClients.custom()
        .setConnectionManager(connectionManager)
         // 问题一解决方案:设置重试
        .setRetryHandler(new MyRetryHandler()) 
         // 问题二解决方案:调整 keepAliveTimeout
        .setKeepAliveStrategy(myStrategy)
        .setDefaultRequestConfig(requestConfig)
        .setDefaultConnectionConfig(connectionConfig)
        .build();

// TODO : 待填坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值