如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

超时处理

在 HTTP 组件的上下文中,必须考虑两个时序区域:spring-doc.cadn.net.cn

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

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

对于出站端点,我们需要考虑在与远程服务器交互时的工作原理。下面的图片展示了此场景:spring-doc.cadn.net.cn

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

在通过 HTTP 出站网关或 HTTP 出站通道适配器进行主动 HTTP 请求时,您可能需要配置相关的 HTTP 超时行为。 在这些情况下,这两个组件将使用 Spring 的 RestTemplate 支持来执行 HTTP 请求。spring-doc.cadn.net.cn

要配置 HTTP 出站网关和 HTTP 出站通道适配器的超时时间,您可以直接引用一个 RestTemplate Bean(通过使用 rest-template 属性),或者您可以提供一个对 ClientHttpRequestFactory Bean 的引用(通过使用 request-factory 属性)。 Spring 提供了以下 ClientHttpRequestFactory 接口的实现:spring-doc.cadn.net.cn

如果您未显式配置 request-factoryrest-template 属性,则会自动实例化一个默认的 RestTemplate(该默认值使用 SimpleClientHttpRequestFactory)。spring-doc.cadn.net.cn

在某些 JVM 实现中,URLConnection 类对超时的处理可能不一致。spring-doc.cadn.net.cn

例如,来自 Java™ 平台标准版 6 API 规范中的 setConnectTimeoutspring-doc.cadn.net.cn

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

如果您有特定需求,应测试您的超时设置。 考虑使用 HttpComponentsClientHttpRequestFactory,这将转而使用 Apache HttpComponents HttpClient,而不是依赖 JVM 提供的实现。spring-doc.cadn.net.cn

当您使用 Apache HttpComponents HttpClient 并配合连接池管理器时,您应当了解:默认情况下,该连接管理器为每个给定路由最多创建两个并发连接,且总连接数不超过 20 个。 对于许多实际应用场景而言,这些限制可能过于严格。 有关如何配置这一重要组件的详细信息,请参阅 Apache 官方文档

以下示例配置了一个 HTTP 出站网关,该网关使用一个 SimpleClientHttpRequestFactory 进行配置,其连接超时和读取超时分别设置为 5 秒:spring-doc.cadn.net.cn

<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 出站网关spring-doc.cadn.net.cn

对于HTTP 出站网关,XML Schema 仅定义了reply-timeoutreply-timeout映射到org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler类的sendTimeout属性。 更准确地说,该属性被设置在扩展的AbstractReplyProducingMessageHandler类上,该类最终将属性设置在MessagingTemplate上。spring-doc.cadn.net.cn

sendTimeout 属性的默认值为 30 秒,并将应用于已连接的 MessageChannel。 这意味着,具体实现方式可能使 Message Channel 的 send 方法无限期阻塞。 此外,sendTimeout 属性仅在实际的 MessageChannel 实现具有阻塞式发送(例如'full'有界 QueueChannel)时使用。spring-doc.cadn.net.cn

HTTP 入站网关

对于 HTTP 入站网关,XML Schema 定义了 request-timeout 属性,用于在 HttpRequestHandlingMessagingGateway 类(扩展自 MessagingGatewaySupport 类)上设置 requestTimeout 属性。 您还可以使用 reply-timeout 属性来映射到同一类上的 replyTimeout 属性。spring-doc.cadn.net.cn

两个超时属性的默认值均为 1000ms(即一千毫秒或一秒)。 最终,request-timeout 属性用于设置 MessagingTemplate 实例上的 sendTimeout。 另一方面,replyTimeout 属性用于设置 MessagingTemplate 实例上的 receiveTimeout 属性。spring-doc.cadn.net.cn

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