java.net.SocketTimeoutException: null 和 java.net.SocketTimeoutException: connect timed out的区别

背景

故事起源于生产环境的jedisCluster获取连接异常,最终结果都是Could not get a resource from the pool,但是查看具体的报错日志发现有两种不同的超时错误,一个是SocketTimeoutException: null ,另一个是SocketTimeoutException: connect timed out,具体日志如下所示:

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host xxxx
	at redis.clients.jedis.Connection.connect(Connection.java:214)
Caused by: java.net.SocketTimeoutException: null
	at java.net.SocksSocketImpl.remainingMillis(SocksSocketImpl.java:111)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at redis.clients.jedis.Connection.connect(Connection.java:191)
	... 61 common frames omitted
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host xxx
	at redis.clients.jedis.Connection.connect(Connection.java:214)
Caused by: java.net.SocketTimeoutException: connect timed out
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at redis.clients.jedis.Connection.connect(Connection.java:191)	

百思不得其解,为啥都是connect方法超时,会有两种超时日志呢?他们有什么不同的地方?

追查真相

首先查看报错对应的socketImpl的具体代码位置,首先是:SocketTimeoutException: null 在这里插入图片描述
在这里插入图片描述
从这里可以看出对于这种超时异常,在tcp的层面上来说甚至都没有发出连接第一个syc的tcp包.直接在java代码里面判断时间就超时了,这种超时极大的可能是因为gc暂停的时间大于连接超时时间导致的.

再来看看第二个SocketTimeoutException: connect timed out,具体代码位置如下:
在这里插入图片描述

在这里插入图片描述
可以明显看出这个连接超时是明显已经发起了tcp的连接请求,也就是tcp的syn包已经发出,这里的超时可能有三种情况:
第一种是java的gc停顿时间大于超时时间,
第二种是网络超时,也就是客户端和服务器的网络出现中断等
第三种是redis服务器故障,无法接受网络连接.

总结

这两种socket超时对应着不同的排除超时的方向,1.SocketTimeoutException: null 这种超时只和jedis客户端所在的进程有关,因为此时tcp连接甚至都还没有发起.
2.SocketTimeoutException: connect timed out这个原因就比较多了。一个是jedis客户端比如因为gc暂停,一个是因为网络,另一个是因为redis服务器故障.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值