出站消息转换

Spring AMQP 1.4 引入了 ContentTypeDelegatingMessageConverter,其中实际的转换器是根据传入内容类型消息属性选择的。这可以由入站端点使用。

从 Spring Integration 4.3 版本开始,您也可以在出站端点上使用 ContentTypeDelegatingMessageConverter,通过 contentType 标头指定使用哪个转换器。

以下示例配置了一个 ContentTypeDelegatingMessageConverter,默认转换器为 SimpleMessageConverter(处理 Java 序列化和纯文本),同时还配置了一个 JSON 转换器

<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 发送 contentType 标头设置为 application/json 的消息将导致选择 JSON 转换器。

这适用于出站通道适配器和网关。

从 5.0 版本开始,添加到出站消息 MessageProperties 的标头(默认情况下)永远不会被映射的标头覆盖。以前,只有当消息转换器是 ContentTypeDelegatingMessageConverter 时才会出现这种情况(在这种情况下,标头首先被映射,以便可以选择适当的转换器)。对于其他转换器,例如 SimpleMessageConverter,映射的标头会覆盖转换器添加的任何标头。这导致当出站消息有一些遗留的 contentType 标头(可能来自入站通道适配器)并且正确的出站 contentType 被错误覆盖时出现问题。解决方法是使用标头过滤器在将消息发送到出站端点之前删除标头。

然而,在某些情况下需要以前的行为,例如,当一个包含 JSON 的 String 有效负载时,SimpleMessageConverter 不知道内容,并将 contentType 消息属性设置为 text/plain,但您的应用程序希望通过设置发送到出站端点的消息的 contentType 标头将其覆盖为 application/jsonObjectToJsonTransformer 默认情况下正是这样做的。

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

从 5.1.9 版本开始,为 AmqpInboundGateway 提供了类似的 replyHeadersMappedLast,当我们生成回复并希望覆盖由转换器填充的标头时。请参阅其 Javadocs 以获取更多信息。

© . This site is unofficial and not affiliated with VMware.