该版本仍在开发中,尚未被视为稳定。请使用最新的稳定版本,使用 Spring AMQP 4.0.0!spring-doc.cadn.net.cn

注释方法的消息转换

在调用听者之前,流程中有两个转换步骤。 第一步使用消息转换器以改造即将到来的春季AMQP消息到Spring的信息传递消息. 当目标方法被调用时,消息有效载荷会如有需要被转换为方法参数类型。spring-doc.cadn.net.cn

默认消息转换器第一步是春季AMQP简易消息转换器该系统处理转换为字符串java.io.Serializable对象。 其他所有内容仍为字节[]. 在接下来的讨论中,我们称之为“消息转换器”。spring-doc.cadn.net.cn

第二步的默认转换器是通用消息转换器,该服务委托给转换服务 (一个实例DefaultFormattingConversionService). 在接下来的讨论中,我们称之为“方法参数转换器”。spring-doc.cadn.net.cn

要更改消息转换器,你可以将其作为容器工厂豆子的属性添加。 以下示例展示了如何实现: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

你也可以使用内容类型委托消息转换器,可以处理不同内容类型的转换。spring-doc.cadn.net.cn

从2.3版本开始,你可以通过在消息转换器财产。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

在大多数情况下,除非你想使用 一种习俗转换服务.spring-doc.cadn.net.cn

在1.6之前的版本中,转换JSON的类型信息必须在消息头中提供,或者 习惯ClassMapper是必须的。 从1.6版本开始,如果没有类型信息头,可以从目标推断出类型 方法论元。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());
    }

    ...

}
对于多方法监听器(参见多方法监听器),方法选择基于消息转换后的有效载荷。 方法参数转换器只有在方法被选中后才被调用。