註解方法的轉換訊息
在呼叫監聽器之前,管道中有兩個轉換步驟。第一步使用 MessageConverter 將傳入的 Spring AMQP Message 轉換為 Spring Messaging Message。當目標方法被呼叫時,訊息負載(如果需要)會轉換為方法引數型別。
第一步的預設 MessageConverter 是 Spring AMQP SimpleMessageConverter,它處理轉換為 String 和 java.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());
}
...
}
| 對於多方法監聽器(請參閱 多方法監聽器),方法選擇基於訊息轉換後的訊息負載。方法引數轉換器僅在方法被選中後才呼叫。 |