超时处理

在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文档

以下示例使用配置了连接和读取超时分别为5秒的SimpleClientHttpRequestFactory配置HTTP出站网关。

<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。这意味着,根据实现的不同,Message Channel的send方法可能会无限期阻塞。此外,只有当实际的MessageChannel实现具有阻塞发送(例如“full”有界QueueChannel)时,才会使用sendTimeout属性。

HTTP入站网关

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

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

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