超时处理
在 HTTP 组件的上下文中,必须考虑两个计时区域:
-
与 Spring 集成通道交互时的超时
-
与远程 HTTP 服务器交互时超时
这些组件与消息通道交互,可以为其指定超时。 例如,HTTP 入站网关将从连接的 HTTP 客户端收到的消息转发到消息通道(使用请求超时),因此 HTTP 入站网关从用于生成 HTTP 响应的回复通道(使用回复超时)接收回复消息。 下图提供了直观的说明:
对于出站终端节点,我们需要考虑在与远程服务器交互时 timing 的工作原理。 下图显示了此方案:
在使用 HTTP 出站网关或 HTTP 出站通道适配器发出活动 HTTP 请求时,您可能希望配置与 HTTP 相关的超时行为。
在这些情况下,这两个组件使用 Spring 的 RestTemplate
支持来执行 HTTP 请求。
要为 HTTP 出站网关和 HTTP 出站通道适配器配置超时,可以直接引用 Bean(通过使用该属性),也可以提供对ClientHttpRequestFactory
Bean 的引用(通过使用该属性)。
Spring 提供了接口的以下实现:RestTemplate
rest-template
request-factory
ClientHttpRequestFactory
-
SimpleClientHttpRequestFactory
:使用标准 J2SE 工具发出 HTTP 请求 -
HttpComponentsClientHttpRequestFactory
:使用 Apache HttpComponents HttpClient(自 Spring 3.1 起)
如果未显式配置 or 属性,则会实例化默认值(使用 )。request-factory
rest-template
RestTemplate
SimpleClientHttpRequestFactory
对于某些 JVM 实现,类对超时的处理可能不一致。 例如,来自 Java™ Platform, Standard Edition 6 API 规范中的: 此方法的某些非标准实现可能会忽略指定的超时。
要查看该集合,请调用 getConnectTimeout()。
如果您有特定需求,则应测试您的超时。
考虑使用 ,而 则使用 Apache HttpComponents HttpClient,而不是依赖 JVM 提供的实现。 |
当您将 Apache HttpComponents HttpClient 与池连接管理器一起使用时,您应该知道,默认情况下,连接管理器为每个给定路由创建的并发连接不超过 2 个,总共不超过 20 个连接。 对于许多实际应用程序,这些限制可能被证明过于限制。 请参阅 Apache 文档 以了解有关配置此重要组件的信息。 |
以下示例使用分别配置了 5 秒的 connect 和 read 超时的 来配置 HTTP 出站网关:SimpleClientHttpRequestFactory
<int-http:outbound-gateway url="https://samples.openweathermap.org/data/2.5/weather?q={city}"
http-method="GET"
expected-response-type="java.lang.String"
request-factory="requestFactory"
request-channel="requestChannel"
reply-channel="replyChannel">
<int-http:uri-variable name="city" expression="payload"/>
</int-http:outbound-gateway>
<bean id="requestFactory"
class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="5000"/>
<property name="readTimeout" value="5000"/>
</bean>
HTTP 出站网关
对于 HTTP 出站网关,XML 架构仅定义 reply-timeout。
reply-timeout 映射到org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler类的sendTimeout属性。
更准确地说,该属性是在扩展类上设置的,而扩展类最终会在 .AbstractReplyProducingMessageHandler
MessagingTemplate
sendTimeout 属性的值默认为秒,并将应用于连接的 .
这意味着,根据实现,Message Channel 的 send 方法可能会无限期地阻塞。
此外,仅当实际的MessageChannel实现具有阻塞发送(例如“full”bounded QueueChannel)时,才使用sendTimeout属性。30
MessageChannel
HTTP 入站网关
对于 HTTP 入站网关,XML 架构定义属性,该属性用于设置类(在扩展类上)的属性。
还可以使用该特性映射到同一类上的属性。request-timeout
requestTimeout
HttpRequestHandlingMessagingGateway
MessagingGatewaySupport
reply-timeout
replyTimeout
两个 timeout 属性的默认值为 (1000 毫秒或 1 秒)。
最终,该属性用于在实例上设置 。
另一方面,该属性用于设置实例上的属性。1000ms
request-timeout
sendTimeout
MessagingTemplate
replyTimeout
receiveTimeout
MessagingTemplate
要模拟连接超时,您可以连接到不可路由的 IP 地址,例如 10.255.255.10。 |