Spring外部客户端超时

时间:2018-04-30 13:02:05

标签: java spring restclientbuilder

在我们的Spring应用程序中,我们依赖于外部系统。 我们想要对该系统的请求设置超时,但无法弄清楚如何配置它。

我们用这个:

   return clientBuilder.build()
            .target(baseUrl)
            .register(jsonProvider)
            .register(jsonAcceptHeaderClientRequestFilter)
            .register(new LoggingFilter());

我试过这个: How to set the connection and read timeout with Jersey 2.x?以及许多其他建议,但无法让它发挥作用。任何建议将不胜感激。

更新不起作用的东西:

.property("http.connection.timeout", 1)
.property("http.receive.timeout", 1)

以及

.property(ClientProperties.CONNECT_TIMEOUT,1)
.property(ClientProperties.READ_TIMEOUT,1)

2 个答案:

答案 0 :(得分:2)

正如您在问题中所提及的答案中所确认的那样,@ df778899的评论之一,根据我的测试,以下用法可以正常使用jersey客户

target(baseUrl)
.property(ClientProperties.CONNECT_TIMEOUT, 1000)
.property(ClientProperties.READ_TIMEOUT, 1000)

如果外部服务器在设定的时间内没有响应,则生成java.net.SocketTimeoutException

对于Apache CXF客户端,我在下面的代码段中进行了测试,它适用于读取超时。而且,这是官方reference。搜索该页面下面代码段中使用的参数。

注意:对于支持此版本的版本,请检查此JIRA

target(baseUrl)
.property("http.connection.timeout", 5000)
.property("http.receive.timeout", 5000)

更新 OP可能不需要以下内容,但为了学术原因而保留。

我的预感是,你追求的是另一个目标。在我看来,你的外部系统实际上是在响应,但可能比你想要的速度慢,或者响应本身更大,这反过来需要更长的时间来消耗?

在这种情况下,您可以调整超时参数。但是,它们以循环套接字读取为基础。因此,请考虑将超时设置为X,并将响应数据设置为Y个字节。慢速读取可能意味着socket.read()调用将出现数据,但内容为1/2字节。 X适用于每次阅读。因此,完整读取理论上可以X*Y ms。

如果上面确实是你的问题,那么你可能需要使用外部计时器来解决这个问题。例如,您可以:

  1. 通过ExecutorService.submit(Callable< T> task)
  2. 拨打外部服务电话
  3. 然后,调用结果Future.get(long timeout, TimeUnit unit)

答案 1 :(得分:0)

您可以使用server.connection-timeout,但这会为所有请求设置超时,而不仅仅是对外部系统的请求。

  

server.connection-timeout = #连接器在关闭之前等待另一个HTTP请求的时间   连接。未设置时,连接器的特定于容器的默认值   用来。使用值-1表示否(即无限大)   超时。

Reference