很长一段时间内我们应用的日志都是超时都是下面这样的,不管 mysql,httpclient 还是什么
com.xx.oo.Exception: 发送请求数据异常
.....
.....
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
至于你连谁超时,抱歉,无可奉告! 这个应该算是底层库的设计缺陷还是使用者的问题?
1
6IbA2bj5ip3tK49j 2020-04-29 17:35:10 +08:00
使用者。
一个 tcp 连接,底层鬼知道你连的啥。 再说,你这个日志不是已经写了吗,httpClient |
2
chendy 2020-04-29 21:27:05 +08:00
就超时,谁写的问谁,谁的服务问谁…
|
3
opengps 2020-04-29 22:11:15 +08:00
var url = "xxxxxx";
try{ //code web 请求 url }catch(Exception ex){ //日志记录异常信息 ex.ToString ();//你的日志只记录了这个 url;//日志还应该记录这个 } |
4
pmispig OP @xgfan 比如 httpclient 这一层,得把域名或者 IP 抛出来吧,就知道 httpclient,鬼知道你连的谁
|
5
Jrue0011 2020-04-30 12:53:24 +08:00
@pmispig http component 4.5 如果只是建立连接失败的话应该是会带上 host 信息的(ConnectTimeoutException 、HttpHostConnectException),后面 socket 读取异常貌似就不带了
|
6
pmispig OP @Jrue0011 我觉得就是这些底层的包不负责任。要是我来设计 一个 httpclient 的话,底层的 socket timeout 要抛出 ip 和端口,httpclient 顶层要抛出完整域名
|
7
cyd 2020-05-15 16:59:58 +08:00
巧了,我也遇到这个异常。刚刚解决。
原因是 httpclient 默认永久连接,服务端空闲时间过长,断连客户端,客户端无感知,连接复用时候就报错了。 得按照官方文档说法,另启个线程检测,搜索这个 IdleConnectionMonitorThread 就行。 |