使用spring-integration创建的Socket上设置了哪些超时?

时间:2017-09-13 08:18:57

标签: java spring sockets spring-integration

我有两个bean创建与服务器的客户端套接字连接:AbstractClientConnectionFactoryTcpOutboundGateway

服务器提供超时1分钟。

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

可以使用以下属性:

factory.setSoTimeout();
gateway.setRequestTimeout();
gateway.setRemoteTimeout();

从客户角度来看,哪些超时是正确的?或者我应该将它们全部设置为等于60000L

我问,因为我'现在只使用factory.setSoTimeout(60000L),并在10秒后获得套接字超时。那么也许我必须另外设置网关超时?

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

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

1 个答案:

答案 0 :(得分:1)

  

factory.setSoTimeout();

在套接字本身上设置了SO超时;如果在该时间内没有收到回复,则读者线程会获得异常。如果我们最近没有发送消息(意味着我们期待回复),则套接字将关闭。如果我们最近发送了一条消息,我们将等待一个套接字超时,然后关闭套接字。

  

gateway.setRequestTimeout();

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

  

gateway.setRemoteTimeout();

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

SO timeout和remoteTimeout有效地做同样的事情;只是有不同的实现。

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