【问题标题】:Spring + AMQP serialise object messageSpring + AMQP 序列化对象消息
【发布时间】:2016-02-02 15:41:11
【问题描述】:

我有一个应用程序,它使用 Spring AMQP 的 RabbitTemplate 发布消息,并使用 MessageListenerAdapter 订阅 POJO 上的消息,这与 Getting Started - Messaging with RabbitMQ 指南非常相似。

void handleMessage(final String message) {...}

rabbitTemplate.convertAndSend(EXCHANGE_NAME, QUEUE_NAME, "message");

但是,这是以String 的形式发送消息;肯定有办法直接发送和接收 Object 消息吗?

我尝试注册JsonMessageConverter,但无济于事。

任何帮助将不胜感激 - 目前我正在手动反序列化任何一侧的字符串,这看起来很混乱,我很惊讶这不是受支持的功能。

【问题讨论】:

    标签: spring rabbitmq amqp spring-amqp


    【解决方案1】:

    我尝试注册一个 JsonMessageConverter 但无济于事。

    最好看看你的尝试并找出我们这边的问题。

    现在我只能说你应该为发送和接收部分提供JsonMessageConverter

    我刚刚测试了gs-messaging-rabbitmq

    @Autowired
    RabbitTemplate rabbitTemplate;
    
    @Autowired
    MessageConverter messageConverter;
    
    .....
    
    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver, MessageConverter messageConverter) {
        MessageListenerAdapter adapter = new MessageListenerAdapter(receiver, "receiveMessage");
        adapter.setMessageConverter(messageConverter);
        return adapter;
    }
    
    @Bean
    MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
    
     .....
    
    System.out.println("Sending message...");
    rabbitTemplate.setMessageConverter(messageConverter);
    rabbitTemplate.convertAndSend(queueName, new Foo("Hello from RabbitMQ!"));
    

    Receiver 已更改为:

    public void receiveMessage(Foo message) {
        System.out.println("Received <" + message + ">");
        latch.countDown();
    }
    

    所以,输出是:

    Waiting five seconds...
    Sending message...
    Received <Foo{foo='Hello from RabbitMQ!'}>
    

    当我们像这样使用Foo 时:

    @Override
    public String toString() {
        return "Foo{" +
                "foo='" + foo + '\'' +
                '}';
    }
    

    使用适当的 getter 和 setter。

    【讨论】:

      【解决方案2】:

      感谢@Artem 的提示。我的代码与Getting Started Guide 差不多,我已经尝试添加Converter

      但正如@Artem 所指出的,诀窍是向容器、侦听器适配器和 rabbit 模板(在示例中自动配置)注册转换器。

      所以我的@Configuration 类现在看起来像这样,除了Getting Started Guide 中提到的任何内容:

      @Bean
      SimpleMessageListenerContainer container(final ConnectionFactory connectionFactory, final MessageListenerAdapter messageListenerAdapter,
          final MessageConverter messageConverter)
      {
          final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
          container.setConnectionFactory(connectionFactory);
          container.setQueueNames(QUEUE_NAME);
          container.setMessageListener(messageListenerAdapter);
          container.setMessageConverter(messageConverter);
      
          return container;
      }
      
      @Bean
      RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory, final MessageConverter messageConverter)
      {
          final RabbitTemplate rabbitTemplate = new RabbitTemplate();
          rabbitTemplate.setConnectionFactory(connectionFactory);
          rabbitTemplate.setMessageConverter(messageConverter);
      
          return rabbitTemplate;
      }
      
      @Bean
      MessageConverter messageConverter()
      {
          return new Jackson2JsonMessageConverter();
      }
      
      @Bean
      Receiver receiver()
      {
          return new Receiver();
      }
      
      @Bean
      MessageListenerAdapter listenerAdapter(final Receiver receiver, final MessageConverter messageConverter)
      {
          return new MessageListenerAdapter(receiver, messageConverter);
      }
      

      这意味着Receiver 可以有一个对象方法签名,例如:

      void handleMessage(final CbeEvent message)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多