超时处理

在 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™ 平台标准版 6 API 规范中关于 setConnectTimeout 的内容:

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

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

当您将 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 Schema 仅定义了 reply-timeoutreply-timeout 映射到 org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler 类的 sendTimeout 属性。更准确地说,该属性设置在扩展的 AbstractReplyProducingMessageHandler 类上,该类最终将属性设置在 MessagingTemplate 上。

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

HTTP 入站网关

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

这两个超时属性的默认值都是 1000ms(一千毫秒或一秒)。最终,request-timeout 属性用于在 MessagingTemplate 实例上设置 sendTimeout。另一方面,replyTimeout 属性用于在 MessagingTemplate 实例上设置 receiveTimeout 属性。

要模拟连接超时,您可以连接到不可路由的 IP 地址,例如 10.255.255.10。
© . This site is unofficial and not affiliated with VMware.