我使用spring AMQP创建了一个消息监听器,我用它来接收订单POJO。消息类型是application / json,所以我设置了一个jackson消息转换器。 直到现在一切正常,我能够在我的监听器中自动重新创建订单POJO对象。 但是,我想扩展此示例,并希望检查我的侦听器中的某些消息属性。因此,我没有在handleMessage()中使用我的订单POJO,而是想使用" org.springframework.amqp.core.Message"作为参数。然后我可以转换主体,但是这样我将在我的应用程序中使用所有与消息相关的属性,我可以在我的应用程序中使用它。
我尝试将handleMessage()与Message参数一起使用,但似乎它尝试使用jackson转换器转换消息体。我不知道在哪里通过订单POJO类杰克逊可以用来转换我的邮件正文但仍应该能够正确转换邮件。
请在下面找到我的代码中的重要摘要。 请帮助我,因为我认为我遇到了障碍。
POJO
public class Order {
private int orderid;
private String itemDescription;
模板和转换器设置
@Bean
public RabbitTemplate rubeExchangeTemplate() {
logger.info("Lets test autowiring " + rabbitConnectionFactory.getHost());
RabbitTemplate r = new RabbitTemplate(this.rabbitConnectionFactory);
r.setExchange("rmq-exchange");
r.setMessageConverter(jsonMessageConverter());
return r;
}
@Bean
public MessageConverter jsonMessageConverter()
{
final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
converter.setClassMapper(classMapper());
return converter;
}
@Bean
public DefaultClassMapper classMapper()
{
DefaultClassMapper typeMapper = new DefaultClassMapper();
typeMapper.setDefaultType(Order.class);
return typeMapper;
}
我发送的消息(messageText包含符合订单POJO的JSON)
Message message = MessageBuilder.withBody(messageText.getBytes())
.setMessageId("123")
.setContentType("application/json")
.setHeader("bar", "baz")
.build();
LISTENER
@Bean(value = "rube")
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(cf);
container.setQueueNames("rmq-rube-queue");
container.setMessageListener(messageListenerAdapter());
return container;
}
@Bean
public MessageListenerAdapter messageListenerAdapter() {
MessageListenerAdapter listener = new MessageListenerAdapter(pm, converter);
return listener;
}
答案 0 :(得分:3)
在这种情况下不要使用MessageListenerAdapter
,只需实施MessageListener
即可获取原始邮件。
或者,考虑使用newer, annotation-based, POJO listener,您可以在其中访问标头以及转换后的有效负载......
@RabbitListener(queues = "foo")
public void listen(MyPojo pojo, @Header("foo") String fooHeader) { ... }