如何使用带有 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.
我正在使用 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.