我有两个 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 提供了一种使用共享套接字池的机制。同样,此超时不适用(但如果所有套接字都在使用中,则池有超时)。
gateway.setRemoteTimeout();
这是网关本身等待回复的时间;如果过期,套接字将关闭。
SO timeout 和remoteTimeout 实际上做同样的事情;只是有不同的实现。
您可以将两者设置为至少您期望请求所花费的时间,或者将 SO 超时保留为默认值(无穷大)。
关于java - 在使用 spring-integration 创建的 Socket 上设置哪些超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46192422/