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

时间:2016-04-05 12:18:49

标签: spring spring-amqp spring-rabbit spring-rabbitmq

我使用的是Spring 4.2和spring-amqp 1.5.5,并且我实现了自己的org.springframework.amqp.core.Message。此消息转换器应通过查看消息正文中包含的属性在@RabbitListener和Java对象之间进行映射。但我找不到一种方法来应用此消息转换器与@RabbitListener public void process(MyEvent myEvent) { .. } 注释结合使用。我想做的是这样的事情:

DefaultMessageHandlerMethodFactory

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

实现我自己的__TypeId__的原因是因为我们从非Java应用程序生成消息,这些消息没有添加Spring使用的魔术SimpleRabbitListenerContainerFactory标头来确定要将主体反序列化的类

我尝试定义@Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(rabbitConnectionFactory()); factory.setMessageConverter(messageConverter()); return factory; }

org.springframework.amqp.support.converter.MessageConverter

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

所以我的问题是,如何应用我的{{1}}?

1 个答案:

答案 0 :(得分:2)

你正在以正确的方式做到这一点,所以必须发生其他事情,也许这个bean被另一个定义所覆盖?您可以尝试为bean提供不同的名称,并在@RabbitListener中明确引用它。

我们有很多测试用例来测试此功能this one for example及其use here

顺便提一下,在即将发布的1.6版the type from the listener method is provided to the converter中,它有助于丢失__TypeId__标题。