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

标签 java spring rabbitmq amqp spring-amqp

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

我尝试将 handleMessage() 与 Message 参数一起使用,但它似乎也尝试使用 jackson 转换器来转换消息正文。我不确定在哪里传递 Order POJO 类 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;
}

MESSAGE WHICH I AM SENDING(messageText 包含符合 Order 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 ,您可以在其中访问 header 以及转换后的有效负载...

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

关于java - 在 spring AMQP 中使用消息监听器适配器获取消息对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976292/

相关文章:

java - com.google.cloud.storage.StorageImpl 的 clojure java 互操作

java - 从 crontab 运行的 java 程序的日志结果 [权限被拒绝]

java - Spring中具有相同名称的多个字段

java - 嵌入式 Tomcat 7 将 Spring 应用程序上下文传递给 servlet

java - Spring MVC 中没有 GET/映射

spring - Spring AMQP 中的发布者返回是什么

RabbitMQ 连接/断开通知

在有效负载 api 中发送 JSON 消息后 RabbitMQ 错误

java - 在 Jira 插件的速度模板方面需要一些帮助

java - 如何设置某件事在一定时间后发生?