我有两个bean创建与服务器的客户端套接字连接:AbstractClientConnectionFactory
和TcpOutboundGateway
。
服务器提供超时1分钟。
问题:我必须在bean上设置哪些超时,以便spring / java在服务器超时之前不会终止连接?
可以使用以下属性:
factory.setSoTimeout();
gateway.setRequestTimeout();
gateway.setRemoteTimeout();
从客户角度来看,哪些超时是正确的?或者我应该将它们全部设置为等于60000L
?
我问,因为我'现在只使用factory.setSoTimeout(60000L)
,并在10秒后获得套接字超时。那么也许我必须另外设置网关超时?
我还发现gateway.setRemoteTimeout(60000L)
仅在设置时才会阻止超时。所以设置这个值也可能是正确的(虽然我不明白为什么超时必须配置两次)。
问题仍然是.setRequestTimeout()
的用途。
答案 0 :(得分:1)
factory.setSoTimeout();
在套接字本身上设置了SO超时;如果在该时间内没有收到回复,则读者线程会获得异常。如果我们最近没有发送消息(意味着我们期待回复),则套接字将关闭。如果我们最近发送了一条消息,我们将等待一个套接字超时,然后关闭套接字。
gateway.setRequestTimeout();
仅当工厂singleUse
为假(表示共享单个连接)时才适用。如果另一个请求正在进行中,那么我们等待访问套接字的时间。由于TCP没有自然的请求/回复关联机制,因此我们不能有2个(或更多)未完成的请求,因此第二个请求必须等到第一个请求完成。如果singleUse
为真,则每个请求都使用一个新套接字,因此不需要这样做。 CachingClientConnectionFactory
提供了一种使用共享套接字池的机制。同样,此超时不适用(但如果所有套接字都在使用中,则池会超时)。
gateway.setRemoteTimeout();
这是网关本身等待回复的时间;如果此过期,套接字将关闭。
SO timeout和remoteTimeout有效地做同样的事情;只是有不同的实现。
您可以将两者设置为至少预期请求的时间,或将SO超时保留为默认值(无穷大)。