Java 在使用spring集成创建的套接字上设置哪些超时?

Java 在使用spring集成创建的套接字上设置哪些超时?,java,spring,sockets,spring-integration,Java,Spring,Sockets,Spring Integration,我有两个bean创建到服务器的客户端套接字连接:AbstractClientConnectionFactory和TcpOutboundGateway 服务器提供1分钟的超时时间 问题:我必须在bean上设置哪些超时,以便spring/java不会在服务器超时之前终止连接 以下属性可用: factory.setSoTimeout(); gateway.setRequestTimeout(); gateway.setRemoteTimeout(); 从客户的角度来看,哪些超时是正确的?或者我应该将

我有两个bean创建到服务器的客户端套接字连接:
AbstractClientConnectionFactory
TcpOutboundGateway

服务器提供1分钟的超时时间

问题:我必须在bean上设置哪些超时,以便spring/java不会在服务器超时之前终止连接

以下属性可用:

factory.setSoTimeout();
gateway.setRequestTimeout();
gateway.setRemoteTimeout();
从客户的角度来看,哪些超时是正确的?或者我应该将它们全部设置为等于60000L吗

我这样问是因为我现在只使用了
factory.setSoTimeout(60000L)
,10秒后就会得到插座超时。所以我可能需要额外设置网关超时

我还发现
gateway.setRemoteTimeout(60000L)
仅在设置超时时才阻止超时。所以设置这个值可能是正确的(尽管我不明白为什么超时必须配置两次)

问题仍然是
.setRequestTimeout()
的用途

factory.setSoTimeout()

SO超时在套接字本身上设置;如果在这段时间内没有收到回复,则读取器线程将获得异常。如果我们最近没有发送消息(意味着我们正在等待回复),那么套接字将关闭。如果我们最近确实发送了一条消息,我们将再等待一次套接字超时,然后关闭套接字

gateway.setRequestTimeout()

这仅适用于工厂
singleUse
为false(表示共享单一连接)的情况。如果另一个请求正在处理中,则是等待访问套接字的时间。由于TCP没有请求/应答关联的自然机制,我们不能有2个(或更多)未完成的请求,因此第二个请求必须等待第一个请求完成。如果
singleUse
为true,则为每个请求使用一个新套接字,因此不需要这样做。
CachingClientConnectionFactory
提供了一种使用共享套接字池的机制。同样,此超时不适用(但如果所有套接字都在使用中,则池有一个超时)

setRemoteTimeout()

这是网关本身等待回复的时间;如果过期,套接字将关闭

因此,timeout和remoteTimeout有效地做了相同的事情;只是使用不同的实现

您可以将这两个时间都设置为至少预期请求的时间,或者将SO超时保留为默认值(无限)