JAX-RS 2.1 ClientBuilder.newBuilderreadTimeout和connectTimeout不起作用

问题描述

我尝试将超时设置为较小,以强制失败以查看发生的情况:

ClientBuilder.newBuilder()
  .readTimeout(1,TimeUnit.NANOSECONDS)
  .connectTimeout(1,TimeUnit.NANOSECONDS)

但是代码似乎仍因认超时值而挂起。

解决方法

readTimeoutconnectTimeout都接受一个TimeUnit参数,这样NANOSECONDS就可以了吗?

这些的Javadoc都读为:

值0表示无穷大。不允许使用负值。

这些通过MILLISECONDS在内部转换为TimeUnit.convert,其中指出:

从细粒度到粗粒度的转换会被截断,因此会失去精度。

这就是这里正在发生的事情。 TimeUnit.convert甚至有一个例子:

例如,将{@code 999}毫秒转换为秒将产生{@code 0}。

将1纳秒转换为毫秒,得到0会是一个类似的问题。

0是无穷大,即操作系统默认超时。

显然,这很明显,但是没有Javadocs指出指定的时间将在内部转换为MILLISECONDS,并提防精度下降。

我浪费了几天时间想知道为什么它不起作用,这是我从多年的网络编程中应该记得的毫秒数是默认单位。