超时处理

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

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

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

对于出站终端节点,我们需要考虑在与远程服务器交互时 timing 的工作原理。 下图显示了此方案:spring-doc.cadn.net.cn

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

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

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

如果您没有显式配置request-factoryrest-template属性,则默认的RestTemplate(它使用SimpleClientHttpRequestFactory) 实例化。spring-doc.cadn.net.cn

对于某些 JVM 实现,由URLConnectionclass 可能不一致。spring-doc.cadn.net.cn

例如,根据 Java™ Platform, Standard Edition 6 API 规范setConnectTimeout:spring-doc.cadn.net.cn

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

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

当您将 Apache HttpComponents HttpClient 与池连接管理器一起使用时,您应该知道,默认情况下,连接管理器为每个给定路由创建的并发连接不超过 2 个,总共不超过 20 个连接。 对于许多实际应用程序,这些限制可能被证明过于限制。 请参阅 Apache 文档 以了解有关配置此重要组件的信息。

以下示例使用SimpleClientHttpRequestFactory分别配置了 5 秒的 connect 和 read timeouts: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 架构仅定义 reply-timeoutreply-timeout 映射到org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler类的sendTimeout属性。 更准确地说,该属性是在扩展的AbstractReplyProducingMessageHandler类,最终在MessagingTemplate.spring-doc.cadn.net.cn

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

HTTP 入站网关

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

这两个 timeout 属性的默认值都是1000ms(1000 毫秒或 1 秒)。 最终,request-timeout属性用于设置sendTimeoutMessagingTemplate实例。 这replyTimeout属性用于设置receiveTimeout属性MessagingTemplate实例。spring-doc.cadn.net.cn

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