2016-02-02 88 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 + '\'' + 
      '}'; 
} 

具有適當的獲取器和設置器。