对于最新的稳定版本,请使用 Spring AMQP 3.2.0! |
带注释的方法的消息转换
在调用侦听器之前,管道中有两个转换步骤。
第一步使用MessageConverter
将传入的 Spring AMQPMessage
到 Spring 消息Message
.
调用目标方法时,如有必要,消息负载将转换为 method 参数类型。
默认的MessageConverter
第一步是 Spring AMQPSimpleMessageConverter
处理转换为String
和java.io.Serializable
对象。
所有其他byte[]
.
在下面的讨论中,我们将其称为 “消息转换器”。
第二步的默认转换器是GenericMessageConverter
,它委托给 conversion 服务
(DefaultFormattingConversionService
).
在下面的讨论中,我们将其称为 “method argument converter”。
要更改消息转换器,可以将其作为属性添加到容器工厂 Bean 中。 以下示例显示了如何执行此作:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
...
factory.setMessageConverter(new Jackson2JsonMessageConverter());
...
return factory;
}
这将配置一个 Jackson2 转换器,该转换器需要存在 Headers 信息以指导转换。
您还可以使用ContentTypeDelegatingMessageConverter
,它可以处理不同内容类型的转换。
从版本 2.3 开始,您可以通过在messageConverter
财产。
@Bean
public Jackson2JsonMessageConverter jsonConverter() {
return new Jackson2JsonMessageConverter();
}
@RabbitListener(..., messageConverter = "jsonConverter")
public void listen(String in) {
...
}
这避免了为了更改转换器而必须声明不同的容器工厂。
在大多数情况下,没有必要自定义方法参数转换器,除非你想使用
自定义ConversionService
.
在 1.6 之前的版本中,必须在消息标头中提供用于转换 JSON 的类型信息,或者
习惯ClassMapper
是必需的。
从版本 1.6 开始,如果没有类型信息 headers,则可以从目标推断类型
method 参数。
此类型推理仅适用于@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());
}
...
}
对于多方法侦听器(请参阅多方法侦听器),方法选择基于消息转换后消息的有效负载。 只有在选择方法后,才会调用方法参数转换器。 |