出站訊息轉換

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.