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

Pul*_*kit 2 java spring amqp rabbitmq spring-amqp

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

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

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

POJO

public class Order {

private int orderid;
private String itemDescription;
Run Code Online (Sandbox Code Playgroud)

模板和转换器设置

@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;
}
Run Code Online (Sandbox Code Playgroud)

我正在发送的消息(messageText 包含符合 Order POJO 的 JSON)

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

听者

@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;
}
Run Code Online (Sandbox Code Playgroud)

Gar*_*ell 5

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

或者,考虑使用较新的、基于注释的 POJO 侦听器,您可以在其中访问标头以及转换后的有效负载...

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