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

标签 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() 的用途。

最佳答案

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/

相关文章:

java - Intellij - 项目结构设置(spring 方面配置) - 它们存储在哪里?

java - 聊天客户端程序出现问题

java - Spring JMS 消费者应用程序

java - 如何配置spring应用的多个实现

java - 更改属性文件后,Maven 无法构建 spring boot 应用程序(无法解析配置类)

java - 如何接受自定义的Socket?

java - 从 ANDROID 2.2 (HTC desire) 发送 UDP 包

java - 使用 ArrayList 在 JDBC 中插入,给出的行不按顺序排列

java - 如何在 @Transactional SpringBootTest 测试用例中测试 Spring Batch 作业?

java - 如何预订不同时区的在线 session (视频通话)?