註解方法的轉換訊息

在呼叫監聽器之前,管道中有兩個轉換步驟。第一步使用 MessageConverter 將傳入的 Spring AMQP Message 轉換為 Spring Messaging Message。當目標方法被呼叫時,訊息負載(如果需要)會轉換為方法引數型別。

第一步的預設 MessageConverter 是 Spring AMQP SimpleMessageConverter,它處理轉換為 Stringjava.io.Serializable 物件。所有其他物件都保留為 byte[]。在下面的討論中,我們稱之為“訊息轉換器”。

第二步的預設轉換器是 GenericMessageConverter,它委託給轉換服務(DefaultFormattingConversionService 的一個例項)。在下面的討論中,我們稱之為“方法引數轉換器”。

要更改訊息轉換器,您可以將其作為屬性新增到容器工廠 bean 中。以下示例展示瞭如何實現:

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    ...
    factory.setMessageConverter(new Jackson2JsonMessageConverter());
    ...
    return factory;
}

這配置了一個 Jackson2 轉換器,它期望存在標頭資訊以指導轉換。

您還可以使用 ContentTypeDelegatingMessageConverter,它可以處理不同內容型別的轉換。

從版本 2.3 開始,您可以透過在 messageConverter 屬性中指定 bean 名稱來覆蓋工廠轉換器。

@Bean
public Jackson2JsonMessageConverter jsonConverter() {
    return new Jackson2JsonMessageConverter();
}

@RabbitListener(..., messageConverter = "jsonConverter")
public void listen(String in) {
    ...
}

這避免了僅僅為了更改轉換器而宣告不同的容器工廠。

在大多數情況下,除非您想使用自定義的 ConversionService 等,否則無需自定義方法引數轉換器。

在 1.6 版本之前,用於轉換 JSON 的型別資訊必須在訊息頭中提供,或者需要自定義的 ClassMapper。從 1.6 版本開始,如果沒有型別資訊頭,則可以從目標方法引數推斷型別。

此型別推斷僅適用於方法級別的 @RabbitListener

有關更多資訊,請參閱 Jackson2JsonMessageConverter

如果您希望自定義方法引數轉換器,可以按如下方式操作:

@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {

    ...

    @Bean
    public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        factory.setMessageConverter(new GenericMessageConverter(myConversionService()));
        return factory;
    }

    @Bean
    public DefaultConversionService myConversionService() {
        DefaultConversionService conv = new DefaultConversionService();
        conv.addConverter(mySpecialConverter());
        return conv;
    }

    @Override
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
        registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
    }

    ...

}
對於多方法監聽器(請參閱 多方法監聽器),方法選擇基於訊息轉換後的訊息負載。方法引數轉換器僅在方法被選中後才呼叫。
© . This site is unofficial and not affiliated with VMware.