对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-doc.cadn.net.cn

带注释的方法的消息转换

在调用侦听器之前,管道中有两个转换步骤。 第一步使用MessageConverter将传入的 Spring AMQPMessage到 Spring 消息Message. 调用目标方法时,如有必要,消息负载将转换为 method 参数类型。spring-doc.cadn.net.cn

默认的MessageConverter第一步是 Spring AMQPSimpleMessageConverter处理转换为Stringjava.io.Serializable对象。 所有其他byte[]. 在下面的讨论中,我们将其称为 “消息转换器”。spring-doc.cadn.net.cn

第二步的默认转换器是GenericMessageConverter,它委托给 conversion 服务 (DefaultFormattingConversionService). 在下面的讨论中,我们将其称为 “method argument converter”。spring-doc.cadn.net.cn

要更改消息转换器,可以将其作为属性添加到容器工厂 Bean 中。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

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

这将配置一个 Jackson2 转换器,该转换器需要存在 Headers 信息以指导转换。spring-doc.cadn.net.cn

您还可以使用ContentTypeDelegatingMessageConverter,它可以处理不同内容类型的转换。spring-doc.cadn.net.cn

从版本 2.3 开始,您可以通过在messageConverter财产。spring-doc.cadn.net.cn

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

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

这避免了为了更改转换器而必须声明不同的容器工厂。spring-doc.cadn.net.cn

在大多数情况下,没有必要自定义方法参数转换器,除非你想使用 自定义ConversionService.spring-doc.cadn.net.cn

在 1.6 之前的版本中,必须在消息标头中提供用于转换 JSON 的类型信息,或者 习惯ClassMapper是必需的。 从版本 1.6 开始,如果没有类型信息 headers,则可以从目标推断类型 method 参数。spring-doc.cadn.net.cn

此类型推理仅适用于@RabbitListener在方法级别。

如果您希望自定义方法参数转换器,可以按如下方式进行:spring-doc.cadn.net.cn

@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());
    }

    ...

}
对于多方法侦听器(请参阅多方法侦听器),方法选择基于消息转换后消息的有效负载。 只有在选择方法后,才会调用方法参数转换器。