此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6spring-doc.cadn.net.cn

带注释的方法的消息转换

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

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

第二步的默认转换器是GenericMessageConverter,它委托给转换服务 (一个实例DefaultFormattingConversionService). 在下面的讨论中,我们将其称为“方法参数转换器”。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 转换器,该转换器需要存在标头信息来指导转换。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 版本开始,如果没有类型信息头,则可以从目标中推断出类型 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());
    }

    ...

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