Java Spring外部客户端超时
在Spring应用程序中,我们依赖于外部系统。 我们想在对该系统的请求上设置一个超时,但不知道如何配置它 我们使用这个:Java Spring外部客户端超时,java,spring,restclientbuilder,Java,Spring,Restclientbuilder,在Spring应用程序中,我们依赖于外部系统。 我们想在对该系统的请求上设置一个超时,但不知道如何配置它 我们使用这个: return clientBuilder.build() .target(baseUrl) .register(jsonProvider) .register(jsonAcceptHeaderClientRequestFilter) .register(new Logging
return clientBuilder.build()
.target(baseUrl)
.register(jsonProvider)
.register(jsonAcceptHeaderClientRequestFilter)
.register(new LoggingFilter());
我试过这个:
还有许多其他的建议,但都无法付诸实施。如有任何建议,将不胜感激
更新不起作用的内容:
.property("http.connection.timeout", 1)
.property("http.receive.timeout", 1)
以及
.property(ClientProperties.CONNECT_TIMEOUT,1)
.property(ClientProperties.READ_TIMEOUT,1)
您可以使用
服务器。连接超时
,但这将为所有请求设置超时,而不仅仅是对外部系统的请求
服务器。连接超时=#连接器在关闭服务器之前等待另一个HTTP请求的时间
连接。未设置时,连接器的容器特定默认值
使用。使用值-1表示否(即无限)
超时
您可以使用
服务器。连接超时
,但这将为所有请求设置超时,而不仅仅是对外部系统的请求
服务器。连接超时=#连接器在关闭服务器之前等待另一个HTTP请求的时间
连接。未设置时,连接器的容器特定默认值
使用。使用值-1表示否(即无限)
超时
正如您问题中链接的答案中所确认的,@df778899的一条评论,根据我的测试,以下用法对客户端正常工作 如果外部服务器未能在设置的时间内响应,则生成
java.net.SocketTimeoutException
对于客户端,我已经测试了下面的代码片段,它适用于读取超时。这是官方的。在该页面中搜索以下代码段中使用的参数
注意:对于支持此功能时的版本,请选中此项
更新:OP可能不需要以下内容,但出于学术目的保留
我的直觉是,你在追求一个不同的目标。在我看来,你的外部系统实际上在响应,但可能比你期望的速度慢,或者响应本身更大,这反过来又需要比你期望的更长的时间来消耗
在这种情况下,您可以调整超时参数。但是,它们是在循环套接字读取的基础上工作的。因此,请考虑将超时设置为<代码> x>代码>,并且响应数据为代码> y字节。读取速度慢可能意味着socket.read()调用会输出数据,但内容是1/2字节<代码>X适用于每次读取。因此,理论上,完整读取可能需要X*Y
ms
如果以上确实是您的问题,那么您可能必须使用外部计时器来解决此问题。例如,您可以:
正如您问题中链接的答案中所确认的,@df778899的一条评论,根据我的测试,以下用法对客户来说可以正常使用 如果外部服务器未能在设置的时间内响应,则生成
java.net.SocketTimeoutException
对于客户端,我已经测试了下面的代码片段,它适用于读取超时。这是官方的。在该页面中搜索以下代码段中使用的参数
注意:对于支持此功能时的版本,请选中此项
更新:OP可能不需要以下内容,但出于学术目的保留
我的直觉是,你在追求一个不同的目标。在我看来,你的外部系统实际上在响应,但可能比你期望的速度慢,或者响应本身更大,这反过来又需要比你期望的更长的时间来消耗
在这种情况下,您可以调整超时参数。但是,它们是在循环套接字读取的基础上工作的。因此,请考虑将超时设置为<代码> x>代码>,并且响应数据为代码> y字节。读取速度慢可能意味着socket.read()调用会输出数据,但内容是1/2字节<代码>X适用于每次读取。因此,理论上,完整读取可能需要X*Y
ms
如果以上确实是您的问题,那么您可能必须使用外部计时器来解决此问题。例如,您可以:
它是否必须特定于外部系统的请求?我知道您可以使用
server.connection timeout
属性全局配置请求超时。看到了吗?这也会影响对我们系统的请求超时吗?是的,很遗憾。我不知道通过请求设置超时的任何方法,因为它似乎是由嵌入式服务器(Tomcat)管理的,但可能有另一种方法,如Jersey timeout链接上建议的,可以尝试target(baseUrl).property(ClientProperties.CONNECT\u timeout,1)
或target(baseUrl).property(ClientProperties.READ_TIMEOUT,1)
两者都会导致javax.ws.rs.ProcessingException:java.net.SocketTimeoutException
本地失败。不过,您似乎不太可能没有尝试过这一点-感觉有比上述示例更多的事情发生了?(这是jersey-client-2.14)它是否必须特定于对外部系统的请求
?我知道您可以使用server.connection timeout
属性全局配置请求超时。看到了吗?这也会影响对我们系统的请求超时吗?是的,很遗憾。我不知道通过请求设置超时的任何方法,因为我它似乎是由嵌入式服务器(Tomcat)管理的,但可能有另一种ELSEWHEREHMM,正如泽西岛超时链接上建议的那样,可以尝试target(baseUrl).property(ClientProperties.CONNECT\u timeout,1)
或target(baseUrl).property(ClientProperties.READ\u timeout,1)
两者都会导致javax.ws.rs.ProcessingException:java.net.SocketTimeoutExcepti
target(baseUrl)
.property(ClientProperties.CONNECT_TIMEOUT, 1000)
.property(ClientProperties.READ_TIMEOUT, 1000)
target(baseUrl)
.property("http.connection.timeout", 5000)
.property("http.receive.timeout", 5000)