在我们的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)
答案 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 :(得分:0)
您可以使用server.connection-timeout
,但这会为所有请求设置超时,而不仅仅是对外部系统的请求。
server.connection-timeout = #连接器在关闭之前等待另一个HTTP请求的时间 连接。未设置时,连接器的特定于容器的默认值 用来。使用值-1表示否(即无限大) 超时。