对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
出站消息转换
Spring AMQP 1.4 引入了 ,其中实际的转换器是根据
在 Incoming Content Type Message 属性上。
入站终端节点可以使用此 API。ContentTypeDelegatingMessageConverter
从 Spring 集成版本 4.3 开始,你也可以使用出站端点,标头指定使用哪个转换器。ContentTypeDelegatingMessageConverter
contentType
以下示例配置了一个 ,默认转换器是(处理 Java 序列化和纯文本)以及一个 JSON 转换器:ContentTypeDelegatingMessageConverter
SimpleMessageConverter
<amqp:outbound-channel-adapter id="withContentTypeConverter" channel="ctRequestChannel"
exchange-name="someExchange"
routing-key="someKey"
amqp-template="amqpTemplateContentTypeConverter" />
<int:channel id="ctRequestChannel"/>
<rabbit:template id="amqpTemplateContentTypeConverter"
connection-factory="connectionFactory" message-converter="ctConverter" />
<bean id="ctConverter"
class="o.s.amqp.support.converter.ContentTypeDelegatingMessageConverter">
<property name="delegates">
<map>
<entry key="application/json">
<bean class="o.s.amqp.support.converter.Jackson2JsonMessageConverter" />
</entry>
</map>
</property>
</bean>
将消息发送到 并将标头设置为 将导致选择 JSON 转换器。ctRequestChannel
contentType
application/json
这适用于出站通道适配器和网关。
从版本 5.0 开始,添加到出站消息的 Headers 永远不会被映射的 Headers 覆盖(默认情况下)。
以前,仅当消息转换器是 a 时,才会出现这种情况(在这种情况下,首先映射 Headers,以便可以选择正确的转换器)。
对于其他转换器(如 ),映射的标头会覆盖转换器添加的任何标头。
当出站邮件具有一些剩余报头(可能来自入站通道适配器)并且正确的出站被错误覆盖时,这会导致问题。
解决方法是在将消息发送到出站终端节点之前使用标头筛选条件删除标头。 但是,在某些情况下,需要上述行为,例如,当包含 JSON 的有效负载不知道内容并将 message 属性设置为,但您的应用程序希望通过设置发送到出站终端节点的消息的标头来覆盖该属性。
“ this 正是这样做的(默认情况下)。 现在在出站通道适配器和网关(以及 AMQP 支持的通道)上有一个调用的属性。
将此项设置为可恢复覆盖转换器添加的属性的行为。 从版本 5.1.9 开始,当我们生成回复并希望覆盖转换器填充的标头时,提供了类似的功能。
有关更多信息,请参阅其 JavaDocs。 |