如何使用带有 RabbitListener 注释的自定义 org.springframework.amqp.support.converter.MessageConverter?

How to use a custom org.springframework.amqp.support.converter.MessageConverter with RabbitListener annotation?

我正在使用 Spring 4.2 和 spring-amqp 1.5.5,并且我已经实现了自己的 org.springframework.amqp.support.converter.MessageConverter。该消息转换器应该通过查看消息 body 中包含的 属性 在 org.springframework.amqp.core.Message 和 Java object 之间进行映射。但是我找不到一种方法来应用此消息转换器与 @RabbitListener 注释结合使用。我想做的是这样的:

@RabbitListener
public void process(MyEvent myEvent) {
..
}

但是 Spring 似乎正在使用 DefaultMessageHandlerMethodFactory,您只能向其分配 org.springframework.messaging.converter.MessageConverter 的实例,这与我正在使用的 MessageConverter 类型不同。

实现我自己的 org.springframework.amqp.support.converter.MessageConverter 的原因是因为我们从非 Java 应用程序生成消息,这些应用程序不会添加 __TypeId__ header 使用的魔法 Spring判断class反序列化成body.

我试图定义一个 SimpleRabbitListenerContainerFactory:

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

但它似乎并没有被使用(或者至少它没有任何区别)。

所以我的问题是,如何应用我的 org.springframework.amqp.support.converter.MessageConverter

您的做法是正确的,所以一定是发生了其他事情,也许 bean 被另一个定义覆盖了?您可以尝试给 bean 一个不同的名称并在 @RabbitListener.

中明确引用它

我们有很多测试此功能的测试用例this one for example and its use here

顺便说一下,在即将发布的 1.6 版本中 the type from the listener method is provided to the converter 这有助于弥补 __TypeId__ headers.