注解方法的消息转换
在调用监听器之前,管道中存在两个转换步骤。第一步使用 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());
}
...
}
对于多方法监听器(参见 多方法监听器),方法选择基于消息转换后的消息有效负载。方法参数转换器仅在选择方法后调用。 |