輸出訊息轉換

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 被錯誤地覆寫時,這會導致問題。解決方法是在將訊息傳送到輸出端點之前使用標頭篩選器移除標頭。

但是,在某些情況下,需要先前的行為 - 例如,當 String 酬載包含 JSON 時,SimpleMessageConverter 不知道內容,並將 contentType 訊息屬性設定為 text/plain,但您的應用程式想要透過設定傳送到輸出端點的訊息的 contentType 標頭,將其覆寫為 application/jsonObjectToJsonTransformer 完全可以做到這一點(預設情況下)。

現在,輸出通道適配器和閘道(以及 AMQP 支援的通道)上都有一個名為 headersMappedLast 的屬性。將此設定為 true 會還原覆寫轉換器新增的屬性的行為。

從 5.1.9 版開始,當我們產生回覆並想要覆寫轉換器填入的標頭時,為 AmqpInboundGateway 提供了類似的 replyHeadersMappedLast。請參閱其 JavaDocs 以取得更多資訊。