在Spring AMQP中使用消息侦听器适配器获取消息对象

时间:2016-10-11 11:31:12

标签: java spring rabbitmq amqp spring-amqp

我使用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;
}

1 个答案:

答案 0 :(得分:3)

在这种情况下不要使用MessageListenerAdapter,只需实施MessageListener即可获取原始邮件。

或者,考虑使用newer, annotation-based, POJO listener,您可以在其中访问标头以及转换后的有效负载......

@RabbitListener(queues = "foo")
public void listen(MyPojo pojo, @Header("foo") String fooHeader) { ... }