2016-02-02 49 views
1

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

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

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

但是,这是发送邮件为String的;当然有直接发送和接收对象消息的方法吗?

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

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

回答

1

感谢@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可以有一个对象的方法签名如:

void handleMessage(final CbeEvent message) 
0

我试过注册一个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 + '\'' + 
      '}'; 
} 

具有适当的获取器和设置器。