简体   繁体   English

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

[英]Getting message object using message listener adapter in spring AMQP

I have created a message listener using spring AMQP which I am using to receive an Order POJO. 我使用spring AMQP创建了一个消息监听器,我用它来接收订单POJO。 The message type is application/json and so I have set up a jackson message convertor. 消息类型是application / json,所以我设置了一个jackson消息转换器。 Till now things are working fine and I am able to get the order POJO object recreated automatically in my listener. 直到现在一切正常,我能够在我的监听器中自动重新创建订单POJO对象。 However I want to extend this example and want to check some message property in my listener. 但是,我想扩展此示例,并希望检查我的侦听器中的某些消息属性。 Thus instead of using my Order POJO in my handleMessage() I want to use "org.springframework.amqp.core.Message" as the parameter. 因此,我不想在handleMessage()中使用我的订单POJO,而是使用“org.springframework.amqp.core.Message”作为参数。 I can then later convert the body, but in this way I will have all the message related properties in my listener which I can use in my application. 然后我可以转换身体,但是这样我将在我的监听器中拥有所有与消息相关的属性,我可以在我的应用程序中使用它。

I tried using the handleMessage() with Message parameter but it seems that it tries to convert the message body as well using jackson convertors. 我尝试使用带有Message参数的handleMessage(),但它似乎尝试使用jackson转换器转换消息体。 I am not sure where to pass the Order POJO class jackson can use to convert my message body but should still be able to convert the Message correctly. 我不知道在哪里通过订单POJO类杰克逊可以用来转换我的消息体,但仍然应该能够正确转换消息。

Please find below the important snippets from my code. 请在下面找到我的代码中的重要摘要。 Please help me as I think I have hit a roadblock on this. 请帮助我,因为我认为我遇到了障碍。

POJO POJO

public class Order {

private int orderid;
private String itemDescription;

TEMPLATE AND CONVERTER SETTINGS 模板和转换器设置

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

MESSAGE WHICH I AM SENDING(messageText contains the JSON compliant with the Order POJO) 我发送的消息(messageText包含符合订单POJO的JSON)

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

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

Don't use a MessageListenerAdapter in that case, simply implement MessageListener to get the raw message. 在这种情况下,不要使用MessageListenerAdapter ,只需实现MessageListener即可获取原始消息。

Alternatively, consider using the newer, annotation-based, POJO listener , where you can get access to headers as well as the converted payload... 或者,考虑使用更新的,基于注释的POJO侦听器 ,您可以在其中访问标头以及转换后的有效负载......

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM