此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
概述
Spring Integration AMQP 适配器会自动映射所有 AMQP 属性和标头。
(这是对 4.3 的更改 - 以前,仅映射标准标头)。
默认情况下,使用 DefaultAmqpHeaderMapper
将这些属性复制到 Spring Integration 或从 Spring Integration 复制。MessageHeaders
您可以传入自己的特定于 AMQP 的标头映射器的实现,因为适配器具有支持这样做的属性。
AMQP MessageProperties
中的任何用户定义的标头都将复制到 AMQP 消息或从 AMQP 消息复制,除非 的 或 属性显式否定 .
默认情况下,对于出站映射器,不会映射任何标头。
有关原因,请参阅本节后面显示的警告。requestHeaderNames
replyHeaderNames
DefaultAmqpHeaderMapper
x-*
若要覆盖默认值并恢复到 4.3 之前的行为,请在属性中使用 和 。STANDARD_REQUEST_HEADERS
STANDARD_REPLY_HEADERS
映射用户定义的标头时,这些值还可以包含要匹配的简单通配符模式(如 或)。
匹配所有标头。thing* *thing * |
从版本 4.1 开始,(超类)允许为 和 属性配置令牌(除了现有的 和 )以映射所有用户定义的标头。AbstractHeaderMapper
DefaultAmqpHeaderMapper
NON_STANDARD_HEADERS
requestHeaderNames
replyHeaderNames
STANDARD_REQUEST_HEADERS
STANDARD_REPLY_HEADERS
该类标识 :org.springframework.amqp.support.AmqpHeaders
DefaultAmqpHeaderMapper
-
amqp_appId
-
amqp_clusterId
-
amqp_contentEncoding
-
amqp_contentLength
-
content-type
(请参阅contentType
标头) -
amqp_correlationId
-
amqp_delay
-
amqp_deliveryMode
-
amqp_deliveryTag
-
amqp_expiration
-
amqp_messageCount
-
amqp_messageId
-
amqp_receivedDelay
-
amqp_receivedDeliveryMode
-
amqp_receivedExchange
-
amqp_receivedRoutingKey
-
amqp_redelivered
-
amqp_replyTo
-
amqp_timestamp
-
amqp_type
-
amqp_userId
-
amqp_publishConfirm
-
amqp_publishConfirmNackCause
-
amqp_returnReplyCode
-
amqp_returnReplyText
-
amqp_returnExchange
-
amqp_returnRoutingKey
-
amqp_channel
-
amqp_consumerTag
-
amqp_consumerQueue
如本节前面所述,使用 的标头映射模式是复制所有标头的常用方法。
但是,这可能会产生一些意想不到的副作用,因为某些 RabbitMQ 专有属性/标头也会被复制。
例如,使用联合身份验证时,收到的消息可能具有名为 的属性,该属性包含发送消息的节点。
如果将通配符用于入站网关上的请求和应答标头映射,则会复制此标头,这可能会导致联合出现一些问题。
此回复消息可能会联合回发送代理,发送代理可能会认为消息正在循环,因此会静默丢弃它。
如果希望使用通配符标头映射的便利性,则可能需要在下游流中筛选出一些标头。
例如,若要避免将标头复制回回复,请在将回复发送到 AMQP 入站网关之前使用。
或者,您可以显式列出实际要映射的那些属性,而不是使用通配符。
由于这些原因,对于入站消息,映射器(默认情况下)不映射任何标头。
它也不会将该标头映射到标头,以避免该标头从入站邮件传播到出站邮件。
相反,此标头映射到 ,而 不会映射到输出上。* x-received-from * x-received-from <int:header-filter … header-names="x-received-from"> x-* deliveryMode amqp_deliveryMode amqp_receivedDeliveryMode |
从版本 4.3 开始,可以通过在模式前面加上 来否定标头映射中的模式。
否定的模式具有优先级,因此诸如 does not map (nor nor ) 之类的列表。
标准标头加号和被映射。
否定技术可能很有用,例如,当 JSON 反序列化逻辑以不同的方式在接收方下游完成时,不映射传入消息的 JSON 类型标头。
为此,应为入站通道适配器/网关的标头映射器配置模式。!
STANDARD_REQUEST_HEADERS,thing1,ba*,!thing2,!thing3,qux,!thing1
thing1
thing2
thing3
bad
qux
!json_*
如果您有一个用户定义的标头,该标头以您希望映射的开头,则需要使用 ,如下所示:。
命名的标头现在已映射。! \ STANDARD_REQUEST_HEADERS,\!myBangHeader !myBangHeader |
从版本 5.1 开始,如果出站消息中不存在相应的 或标头,则将分别回退到 mapping 和 to 和 。
入站属性将像以前一样映射到标头。
当消息使用者使用有状态重试时,填充属性非常有用。DefaultAmqpHeaderMapper MessageHeaders.ID MessageHeaders.TIMESTAMP MessageProperties.messageId MessageProperties.timestamp amqp_messageId amqp_timestamp amqp_* messageId |
映射用户定义的标头时,这些值还可以包含要匹配的简单通配符模式(如 或)。
匹配所有标头。thing* *thing * |
如本节前面所述,使用 的标头映射模式是复制所有标头的常用方法。
但是,这可能会产生一些意想不到的副作用,因为某些 RabbitMQ 专有属性/标头也会被复制。
例如,使用联合身份验证时,收到的消息可能具有名为 的属性,该属性包含发送消息的节点。
如果将通配符用于入站网关上的请求和应答标头映射,则会复制此标头,这可能会导致联合出现一些问题。
此回复消息可能会联合回发送代理,发送代理可能会认为消息正在循环,因此会静默丢弃它。
如果希望使用通配符标头映射的便利性,则可能需要在下游流中筛选出一些标头。
例如,若要避免将标头复制回回复,请在将回复发送到 AMQP 入站网关之前使用。
或者,您可以显式列出实际要映射的那些属性,而不是使用通配符。
由于这些原因,对于入站消息,映射器(默认情况下)不映射任何标头。
它也不会将该标头映射到标头,以避免该标头从入站邮件传播到出站邮件。
相反,此标头映射到 ,而 不会映射到输出上。* x-received-from * x-received-from <int:header-filter … header-names="x-received-from"> x-* deliveryMode amqp_deliveryMode amqp_receivedDeliveryMode |
如果您有一个用户定义的标头,该标头以您希望映射的开头,则需要使用 ,如下所示:。
命名的标头现在已映射。! \ STANDARD_REQUEST_HEADERS,\!myBangHeader !myBangHeader |
从版本 5.1 开始,如果出站消息中不存在相应的 或标头,则将分别回退到 mapping 和 to 和 。
入站属性将像以前一样映射到标头。
当消息使用者使用有状态重试时,填充属性非常有用。DefaultAmqpHeaderMapper MessageHeaders.ID MessageHeaders.TIMESTAMP MessageProperties.messageId MessageProperties.timestamp amqp_messageId amqp_timestamp amqp_* messageId |
标题contentType
与其他标头不同,前缀不为 ;这允许在不同技术之间透明地传递 contentType 标头。
例如,发送到 RabbitMQ 队列的入站 HTTP 消息。AmqpHeaders.CONTENT_TYPE
amqp_
标头映射到 Spring AMQP 的属性,随后映射到 RabbitMQ 的属性。contentType
MessageProperties.contentType
content_type
在版本 5.1 之前,此标头也被映射为映射中的条目;这是不正确的,此外,该值可能是错误的,因为底层 Spring AMQP 消息转换器可能已更改内容类型。
此类更改将反映在 first-class 属性中,但不会反映在 RabbitMQ 标头映射中。
入站映射忽略标头映射值。 不再映射到标头映射中的条目。MessageProperties.headers
content_type
contentType