超时处理
在 HTTP 组件的上下文中,需要考虑两个计时区域
-
与 Spring Integration 通道交互时的超时
-
与远程 HTTP 服务器交互时的超时
这些组件与消息通道交互,可以为其指定超时时间。例如,HTTP 入站网关将从连接的 HTTP 客户端接收到的消息转发到消息通道(使用请求超时),然后 HTTP 入站网关从回复通道(使用回复超时)接收回复消息,该消息用于生成 HTTP 响应。以下插图提供了直观的解释
对于出站端点,我们需要考虑与远程服务器交互时的计时方式。下图显示了这种情况
您可能希望配置 HTTP 相关超时行为,当使用 HTTP 出站网关或 HTTP 出站通道适配器进行主动 HTTP 请求时。在这些情况下,这两个组件使用 Spring 的 RestTemplate
支持来执行 HTTP 请求。
要为 HTTP 出站网关和 HTTP 出站通道适配器配置超时,您可以直接引用 RestTemplate
bean(使用 rest-template
属性),也可以提供对 ClientHttpRequestFactory
bean 的引用(使用 request-factory
属性)。Spring 提供以下 ClientHttpRequestFactory
接口的实现
-
SimpleClientHttpRequestFactory
: 使用标准 J2SE 功能进行 HTTP 请求 -
HttpComponentsClientHttpRequestFactory
: 使用 Apache HttpComponents HttpClient(自 Spring 3.1 起)
如果您没有显式配置 request-factory
或 rest-template
属性,则会实例化一个默认的 RestTemplate
(它使用 SimpleClientHttpRequestFactory
)。
在某些 JVM 实现中, 例如,从 Java™ Platform, Standard Edition 6 API Specification 上的
此方法的一些非标准实现可能会忽略指定的超时。要查看设置的
如果您有特定需求,您应该测试您的超时。考虑使用 |
当您使用 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-timeout。reply-timeout 映射到org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler 类的sendTimeout 属性。更准确地说,该属性是在扩展的 AbstractReplyProducingMessageHandler
类上设置的,该类最终在 MessagingTemplate
上设置该属性。
sendTimeout 属性的值默认为 30
秒,并将应用于连接的 MessageChannel
。这意味着,根据实现的不同,消息通道的send 方法可能会无限期阻塞。此外,只有当实际的消息通道实现具有阻塞发送(例如“满”的绑定队列通道)时,才会使用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。 |