Spring + AMQP序列化对象消息

时间:2016-02-02 15:41:12

标签: spring rabbitmq amqp spring-amqp

我有一个使用Spring AMQP的RabbitTemplate发布消息的应用程序,并使用MessageListenerAdapter在POJO上订阅消息,几乎与Getting Started - Messaging with RabbitMQ指南一样。

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

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

然而,这是以String发送消息;肯定有办法直接发送和接收对象消息吗?

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

任何帮助都会非常感激 - 目前我手动de /序列化任何一方的字符串似乎很乱,我很惊讶这不是一个支持的功能。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

但正如@Artem指出的那样,诀窍是将转换器注册到容器,监听器适配器和兔子模板(在示例中自动配置)。

所以我的@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可以有一个Object方法签名,例如:

void handleMessage(final CbeEvent message)