出站消息转换

Spring AMQP 1.4 引入了ContentTypeDelegatingMessageConverter,其中实际转换器的选择基于 在 Incoming Content Type Message 属性上。 入站终端节点可以使用此 API。spring-doc.cadn.net.cn

从 Spring 集成版本 4.3 开始,您可以使用ContentTypeDelegatingMessageConverter在出站终端节点上,使用contentType标头指定使用哪个转换器。spring-doc.cadn.net.cn

以下示例将ContentTypeDelegatingMessageConverter,默认转换器为SimpleMessageConverter(处理 Java 序列化和纯文本)以及 JSON 转换器:spring-doc.cadn.net.cn

<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>

发送消息到ctRequestChannel使用contentTypeheader 设置为application/json导致选择 JSON 转换器。spring-doc.cadn.net.cn

这适用于出站通道适配器和网关。spring-doc.cadn.net.cn

从版本 5.0 开始,添加到MessageProperties的出站消息永远不会被映射的标头覆盖(默认情况下)。 以前,仅当消息转换器是ContentTypeDelegatingMessageConverter(在这种情况下,首先映射 Header,以便选择合适的转换器)。 对于其他转换器,例如SimpleMessageConverter,映射的标头会覆盖转换器添加的任何标头。 当出站邮件有一些剩余内容时,这会导致问题contentTypeheaders(可能来自入站通道适配器)和正确的出站contentType被错误地覆盖。 解决方法是在将消息发送到出站终端节点之前使用标头筛选条件删除标头。spring-doc.cadn.net.cn

但是,在某些情况下,需要前一个行为 — 例如,当Stringpayload 中,则SimpleMessageConverter不知道内容,并将contentTypemessage 属性设置为text/plain但您的应用程序希望将其覆盖为application/json通过设置contentType标头。 这ObjectToJsonTransformer确实如此(默认情况下)。spring-doc.cadn.net.cn

现在有一个名为headersMappedLast在出站通道适配器和网关上(以及在 AMQP 支持的通道上)。 将此项设置为true恢复覆盖转换器添加的属性的行为。spring-doc.cadn.net.cn

从版本 5.1.9 开始,类似的replyHeadersMappedLastAmqpInboundGateway当我们生成回复并希望覆盖 Converter 填充的 Headers 时。 有关更多信息,请参阅其 JavaDocs。spring-doc.cadn.net.cn