跳到主要内容
版本:7.0.2

超时处理

DeepSeek V3 中英对照 Timeout Handling

在 HTTP 组件的上下文中,有两个时序区域需要考虑:

  • 与 Spring Integration 通道交互时出现超时

  • 与远程 HTTP 服务器交互时出现超时

组件与消息通道进行交互,可以为这些通道指定超时时间。例如,HTTP入站网关将从连接的HTTP客户端接收到的消息转发到消息通道(该通道使用请求超时),随后HTTP入站网关从回复通道(该通道使用回复超时)接收回复消息,该回复消息用于生成HTTP响应。下图提供了直观的解释:

http inbound gateway

图 1. 超时设置如何应用于 HTTP 入站网关

对于出站端点,我们需要考虑在与远程服务器交互时,时序是如何工作的。下图展示了这一场景:

http outbound gateway

图 2. 超时设置如何应用于 HTTP 出站网关

在使用HTTP出站网关或HTTP出站通道适配器发起主动HTTP请求时,您可能需要配置与HTTP相关的超时行为。在这些情况下,这两个组件会使用Spring的RestTemplate支持来执行HTTP请求。

要为 HTTP 出站网关和 HTTP 出站通道适配器配置超时,您可以直接引用 RestTemplate bean(通过使用 rest-template 属性),也可以引用 ClientHttpRequestFactory bean(通过使用 request-factory 属性)。Spring 提供了以下 ClientHttpRequestFactory 接口的实现:

如果你没有显式配置 request-factoryrest-template 属性,系统会实例化一个默认的 RestTemplate(它使用 SimpleClientHttpRequestFactory)。

备注

在某些 JVM 实现中,URLConnection 类对超时的处理可能不一致。

例如,根据 Java™ Platform, Standard Edition 6 API 规范中关于 setConnectTimeout 的说明:

此方法的某些非标准实现可能会忽略指定的超时时间。要查看设置的 connect timeout,请调用 getConnectTimeout()。

如果您有特定需求,应当测试您的超时设置。考虑使用 HttpComponentsClientHttpRequestFactory,它内部使用了 Apache HttpComponents HttpClient,而不是依赖于 JVM 提供的实现。

important

当您使用带有连接池管理器的 Apache HttpComponents HttpClient 时,需要注意默认情况下,连接管理器为每个给定路由创建不超过两个并发连接,且总连接数不超过 20 个。对于许多实际应用场景,这些限制可能过于严格。有关配置此重要组件的信息,请参阅 Apache 文档

以下示例通过使用 SimpleClientHttpRequestFactory 配置了一个 HTTP 出站网关,该工厂分别配置了 5 秒的连接超时和读取超时:

<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-timeoutreply-timeout 映射到 org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler 类的 sendTimeout 属性。更准确地说,该属性是在扩展的 AbstractReplyProducingMessageHandler 类上设置的,最终会在 MessagingTemplate 上设置该属性。

sendTimeout 属性的默认值为 30 秒,并将应用于已连接的 MessageChannel。这意味着,根据具体实现,消息通道的 send 方法可能会无限期阻塞。此外,sendTimeout 属性仅在消息通道的实际实现具有阻塞发送机制(例如“已满”的有界 QueueChannel)时才会被使用。

HTTP 入站网关

对于HTTP入站网关,XML模式定义了request-timeout属性,该属性用于在HttpRequestHandlingMessagingGateway类(继承自MessagingGatewaySupport类)上设置requestTimeout属性。您还可以使用reply-timeout属性来映射到同一类上的replyTimeout属性。

两个超时属性的默认值均为 1000ms(一千毫秒即一秒)。最终,request-timeout 属性用于设置 MessagingTemplate 实例的 sendTimeout。而 replyTimeout 属性则用于设置 MessagingTemplate 实例的 receiveTimeout 属性。

提示

要模拟连接超时,你可以连接到一个不可路由的 IP 地址,例如 10.255.255.10。