问题描述
我尝试将超时设置为较小,以强制失败以查看发生的情况:
ClientBuilder.newBuilder()
.readTimeout(1,TimeUnit.NANOSECONDS)
.connectTimeout(1,TimeUnit.NANOSECONDS)
解决方法
readTimeout和connectTimeout都接受一个TimeUnit
参数,这样NANOSECONDS
就可以了吗?
这些的Javadoc都读为:
值0表示无穷大。不允许使用负值。
这些通过MILLISECONDS
在内部转换为TimeUnit.convert
,其中指出:
从细粒度到粗粒度的转换会被截断,因此会失去精度。
这就是这里正在发生的事情。 TimeUnit.convert
甚至有一个例子:
例如,将{@code 999}毫秒转换为秒将产生{@code 0}。
将1纳秒转换为毫秒,得到0会是一个类似的问题。
0是无穷大,即操作系统默认超时。
显然,这很明显,但是没有Javadocs指出指定的时间将在内部转换为MILLISECONDS,并提防精度下降。
我浪费了几天时间想知道为什么它不起作用,这是我从多年的网络编程中应该记得的毫秒数是默认单位。