对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
超时处理
在 HTTP 组件的上下文中,必须考虑两个计时领域:
-
与 Spring Integration Channels 交互时超时
-
与远程 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™ 平台标准版 6 API 规范 此方法的某些非标准实现可能会忽略指定的超时。
要查看
如果您有特定需求,则应测试超时时间。
考虑使用 |
将 Apache HttpComponents HttpClient 与池连接管理器一起使用时,您应该知道,默认情况下,连接管理器在每个给定路由创建的并发连接不超过两个,总共不超过 20 个连接。 对于许多实际应用来说,这些限制可能过于严格。 有关配置此重要组件的信息,请参阅 Apache 文档。 |
以下示例使用SimpleClientHttpRequestFactory
分别配置了 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 模式仅定义回复超时。
reply-timeout 映射到 org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler 类的 sendTimeout 属性。
更准确地说,该属性是在扩展的AbstractReplyProducingMessageHandler
类,最终将属性设置为MessagingTemplate
.
sendTimeout 属性的值默认为30
秒,并将应用于连接的MessageChannel
.
这意味着,根据实现,消息通道的发送方法可能会无限期地阻塞。
此外,仅当实际的 MessageChannel 实现具有阻塞发送(例如“完整”有界 QueueChannel)时,才使用 sendTimeout 属性。
HTTP 入站网关
对于 HTTP 入站网关,XML 模式定义了request-timeout
属性,用于设置requestTimeout
属性HttpRequestHandlingMessagingGateway
类(在扩展的MessagingGatewaySupport
类)。
您还可以使用reply-timeout
属性映射到replyTimeout
属性。
这两个超时属性的默认值为1000ms
(一千毫秒或一秒)。
最终,request-timeout
属性用于设置sendTimeout
在MessagingTemplate
实例。
这replyTimeout
另一方面,属性用于设置receiveTimeout
属性MessagingTemplate
实例。
若要模拟连接超时,可以连接到不可路由的 IP 地址,例如 10.255.255.10。 |