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

Getting message object using message listener adapter in spring AMQP

我使用 spring AMQP 创建了一个消息侦听器,我用它来接收订单 POJO。消息类型是 application/json 所以我设置了一个 jackson 消息转换器。 到目前为止一切正常,我能够在我的侦听器中自动重新创建订单 POJO 对象。 但是我想扩展这个例子并想在我的监听器中检查一些消息 属性 。因此,我不想在 handleMessage() 中使用 Order POJO,而是想使用 "org.springframework.amqp.core.Message" 作为参数。然后我可以稍后转换主体,但通过这种方式,我将在我的侦听器中拥有所有与消息相关的属性,我可以在我的应用程序中使用这些属性。

我尝试将 handleMessage() 与 Message 参数一起使用,但它似乎也尝试使用 jackson 转换器来转换消息正文。我不确定在哪里传递 Order POJO class jackson 可以用来转换我的消息正文,但应该仍然能够正确转换消息。

请在下面找到我的代码中的重要片段。 请帮助我,因为我认为我在这方面遇到了障碍。

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;
}

我正在发送的消息(消息文本包含符合订单 POJO 的 JSON)

        Message message = MessageBuilder.withBody(messageText.getBytes())
            .setMessageId("123")
            .setContentType("application/json")
            .setHeader("bar", "baz")
            .build();

听众

@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;
}

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

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

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